问题 cmath.h并编译错误


我曾经没有任何问题地使用math.h。现在,我使用一个外部库,它本身有一个名为的文件 math.h,但包括 < cmath>

将此库添加到我的项目(甚至只是添加include目录,而不触及代码)现在会产生大量错误 < cmath> :

C:\ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath(18):错误C2039:'acosf':不是'`global namespace''的成员

C:\ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath(18):错误C2873:'acosf':符号不能在using声明中使用

C:\ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath(18):错误C2039:'asinf':不是'`global namespace''的成员

C:\ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath(18):错误C2873:'asinf':符号不能在using声明中使用

[等等...]

我不明白为什么会这样。我正在使用Visual Studio 2005并在互联网上查看,似乎这个问题在VS 2008下解决了。但是,我想留在VS 2005 ...

包含 using namespace std; 无处不在,或改变我的包含顺序似乎没有改变任何东西。定义 _STD_BEGIN 解决了错误,但产生了多少 < xlocinfo>

怎么解决这个问题?


13191
2017-10-21 00:51


起源

cmath应该用于C ++代码。你是否从C文件中包含此标题? - Alex Jasmin
事实上我的项目中的一个文件是在C中,并包含在extern“C”中。它包括“math.h”,然后在我的外部库的include目录中找到它,并且隐含地包含cmath - 因此我不知道如何修复它。但是,在编译此C代码之前,这些编译错误似乎在我的代码中更早发生。 - WhitAngl
将这段特殊的C代码更改为C ++似乎并没有改变来自cmath的所有编译错误...... - WhitAngl
我不确定我是否正确阅读了你的帖子,但是一个库会发送它自己的math.h文件似乎很奇怪。也许您可以将父目录放在包含路径中,以便可以 #include <my_lib/math.h> 并避免与编译器冲突 math.h? - Alex Jasmin
亚历山大:当然!我没有意识到它们的所有头文件都有一个相对路径,其格式为“my_lib / myheader.h”!非常感谢,这很有道理! - WhitAngl


答案:


我不确定我是否正确地阅读了你的问题,但是一个库会发送它自己的math.h文件似乎很奇怪。

也许你想把父目录放在你的包含路径中 <my_lib/math.h> 可以包含,而不会与您的编译器冲突 <math.h>


4
2017-10-21 01:18





VC 10中存在同样的问题。我想,那 <cmath> 包括一个 math.h 但是在VC附带的正确版本中,它使用了在User-Project中创建的那个(当然具有不同的内容)。

解决方案:永远不要使用名为的文件 math.h 在你的项目...(或纠正std某处)。


12
2017-11-15 00:58



经过2个小时的撕裂我的头发,你的评论让我发现我的项目中有一个Math.h,即使不同的大小写与std的math.h冲突。重命名为Math.h到MathExtensions.h解决了这个问题。谢谢! - KomodoDave
现在,“数学”继续我的简短“源文件永远不应该被命名为”列表。 (我有一个较长的“源文件永远不应该有包含此字符串的名称”的列表,其中包含“错误”,“警告”和“失败”。) - davidbak
问题出现在VS 2015和VS 2017 RC上。将Math.h重命名为ProjectnameMath.h可以解析它。 - Dženan


问题可能是将C库与C ++约定混合在一起。例如:

#include <math.h>
namespace TEST {
}

编译很好,而:

namespace TEST {
  #include <math.h>
}

这会产生大量的虚假错误。

只是为了混淆这个问题:

#include <math.h>
namespace TEST {
  #include <math.h>
}

这也可以编译,因为它只能包含一次(第一次)。

因此:

#include <math.h>
namespace TEST {
  #include "SomethingThatIncludesMath.h"
}

会工作,而:

namespace TEST {
  #include "SomethingThatIncludesMath.h"
}

惯于。

您还可以通过将C ++标头包含在* .c文件中而不是* .cpp文件中来解决类似问题。

我确信其他类似的C和C ++混合可能会导致类似的问题。


0
2018-02-06 12:25





(1)根据微软的说法,C2873意味着;

'symbol':符号不能用于using声明 using指令缺少namespace关键字。这会导致编译器将代码误解为using声明而不是using指令。

(2)当我使用C2203和C2039(我试图合并CEF3和Cinder)时,不知何故我通过更改属性 - >配置属性 - > C / C ++ - >代码生成来绕过这两个错误;

启用最小重建:是(/ Gm),启用C ++异常:是(/ EHsc),启用功能级链接:空


0
2018-02-18 06:34