gpt4 book ai didi

c++ - cmath 和 y0 变量名称未编译

转载 作者:行者123 更新时间:2023-12-02 00:13:35 32 4
gpt4 key购买 nike

我得到了名为 y0 的变量并包含 cmath,当使用不带任何参数的 g++ 编译它时,出现编译错误

错误:“double(double) throw ()”和“double”类型的操作数对二进制“operator+”无效
y = y0 + R;
~~~^~~

为了进行实验,我删除了 cmath,并且一切都编译正常。

#include <iostream>
#include <cmath>

double y0, y, R;
int main() {
std::cin >> y0 >> R;
y = y0 + R;
}

最佳答案

您使用的编译器 g++ 是 unconditionally defining the macro _GNU_SOURCE 。宏_GNU_SOURCE按照man feature_test_macros工作。 。该宏导致 GNU C 库实现 glibc 定义许多额外的 GNU 扩展,这些扩展会污染全局命名空间。在 glibc 中,包含文件 cmath 包含 math.h

这些 GNU 扩展之一是例如 double y0(double) function 这是计算 Bessel 函数的 gnu 扩展。如果您尝试在全局命名空间中将自己的 y0 符号声明为不同的符号,编译器应该会提示为 y0 符号声明的类型冲突。您看到的错误之一是,由于符号 y0 被声明为函数,编译器无法 + 添加它。

正确的解决方法是正确解决 glibc 中的困惑问题并帮助世界各地的开发人员 - 修补 glibc 和 g++,使其在用 c++ 编译时不要导出 gnu 扩展函数。仍如 libstdc++ faq 所示:我们希望找到一个更干净的解决方案,但还没有人贡献时间

另一个解决方法是使用 -U_GNU_SOURCE 编译器开关取消定义 g++ 中的 _GNU_SOURCE 符号。这可能会导致在使用数学模板函数时出现有关未声明符号的错误,因为 glibc/libstdc++ 中的许多数学函数实现都使用 gnu 扩展。另一种解决方法是使用另一个不受此问题影响的标准 C++ 库实现。

一个现实的解决方法是不在全局命名空间中声明 y0 符号。只需添加一个命名空间并正确引用它即可:

namespace my {
double y0;
}
int main() {
my::y0 = 1;
}

关于c++ - cmath 和 y0 变量名称未编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59092549/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com