我曾经没有任何问题地使用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>
。
怎么解决这个问题?
我不确定我是否正确地阅读了你的问题,但是一个库会发送它自己的math.h文件似乎很奇怪。
也许你想把父目录放在你的包含路径中 <my_lib/math.h>
可以包含,而不会与您的编译器冲突 <math.h>
?
VC 10中存在同样的问题。我想,那 <cmath>
包括一个 math.h
但是在VC附带的正确版本中,它使用了在User-Project中创建的那个(当然具有不同的内容)。
解决方案:永远不要使用名为的文件 math.h
在你的项目...(或纠正std某处)。
问题可能是将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 ++混合可能会导致类似的问题。
(1)根据微软的说法,C2873意味着;
'symbol':符号不能用于using声明
using指令缺少namespace关键字。这会导致编译器将代码误解为using声明而不是using指令。
(2)当我使用C2203和C2039(我试图合并CEF3和Cinder)时,不知何故我通过更改属性 - >配置属性 - > C / C ++ - >代码生成来绕过这两个错误;
启用最小重建:是(/ Gm),启用C ++异常:是(/ EHsc),启用功能级链接:空