将 std::copysign 与 g++ 一起使用

Posted

技术标签:

【中文标题】将 std::copysign 与 g++ 一起使用【英文标题】:Using std::copysign with g++ 【发布时间】:2016-11-28 15:09:19 【问题描述】:

我刚刚发现使用 std::copysign 测试的平台之间存在一些不兼容性。

在第一次测试中,我尝试在 MSVC 中测试一些算法。现在我尝试将这个 c++(11) 代码移植到 Xilinx Zynq 平台(A9+FPGA)。

到目前为止,除了没有包含 cmath 的 std::copysign 之外,这一直有效。所以我必须使用没有命名空间的copysign。

将此函数添加到命名空间的正确方法是什么?

PS:我不想仅仅因为命名空间不兼容而手动管理不同平台上的相同文件。

编译标志是:

-c -fmessage-length=0 -MT"$@" -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -std=c++11

【问题讨论】:

您在 g++ 中使用了哪些编译器选项?你确定启用了 C++11 吗? 我正在使用基于 Eclipse 的 Xilinx sdk (2016.3)。我正在使用标志 "-c -fmessage-length=0 -MT"$@" -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -std=c++11" 您可以在构建代码时发布完整的错误信息吗? 你能检查一下你的gcc版本和你的环境吗,我找到了this bug和this @wasthishelpful: "../src/QRDecomposition.cpp:27:14: 错误:'copysign' 不是 'std' s = -1 * std::copysign(s, R.at(n*i + i));" Danh:gcc 版本是 5.2.1(我可以在 gentoo 上用 gcc-4.9.3 确认这个错误不存在) 【参考方案1】:

您可以为 msvc 创建一个宏。

#if defined(_MSC_VER) 
#define copysign std::copysign
#endif

但是,c++11 应该有 std 命名空间。如果您没有启用 c++11 进行编译,您可能会获得一组较旧的库?我会检查以确保您是。如果您无法在您的平台上使用 c++11 进行编译,那么上述内容应该可以工作。如果需要,添加更多预处理器标志以针对更多平台。

另一种选择是

using namespace std;

这将涵盖这两种情况。

【讨论】:

我正在使用 c++11 auto 进行编译,并且其他一些功能按预期工作。另外问题不是MSVC,问题是Xilinx SDK中使用的arm gcc。 你也可以把'using namespace std;'在那里,这将涵盖这两个选项。

以上是关于将 std::copysign 与 g++ 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使 BrowserSync 与 nginx 代理服务器一起工作?

将 gcc/g++ 仪器功能与 MinGW 一起使用?

将C#dll与G-WAN一起使用

更新 ubuntu 10.4 后无法将 errno.h 与 gcc/g++ 一起使用

何时或如何将 QSqlTableModel 上的 fetchMore() 与 SQLite 数据库一起使用以使 rowCount() 工作?

使用 Gitlab 仪表板 - 如何将 grafonnet 与 jsonnet 一起使用以生成我可以与 Grafana 一起使用的 json 文件