cmath.h并编译错误

时间:2010-10-21 00:51:39

标签: visual-studio visual-c++ compiler-errors cmath

我曾经没有任何问题地使用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>中生成了多个。

如何解决这个问题?

4 个答案:

答案 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),启用功能级链接:空