我得到名为y0的变量并包含cmath,当使用g++进行编译而没有任何参数时,出现编译错误
error: invalid operands of types ‘double(double) throw ()’ and ‘double’ to binary ‘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扩展,这些扩展污染了全局 namespace 。在glibc中,包含文件cmath包括math.h

这些gnu扩展之一是double y0(double)函数,它是计算Bessel函数的gnu扩展。如果尝试在全局 namespace 中将自己的y0符号声明为其他符号,则编译器应提示为y0符号声明的类型冲突。您看到的错误之一是因为符号y0被声明为函数,所以编译器无法+将其添加。

正确的解决方法是正确解决glibc中的问题,并帮助世界各地的开发人员-修补glibc和g++时不要在c++中编译时导出gnu扩展函数。仍然由libstdc++ faq指示:We'd like to find a cleaner solution, but nobody yet has contributed the time

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

一个现实的解决方法是不要在全局 namespace 中声明y0符号。只需在其周围添加一个 namespace 并正确引用它即可:

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

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

10-13 06:00