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