12

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

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

C:\Program Files\Microsoft Visual Studio 8\VC\include\cmath(18) : 错误 C2039: 'acosf' : is not a member of '`global namespace''

C:\Program Files\Microsoft Visual Studio 8\VC\include\cmath(18) : 错误 C2873: 'acosf' : symbol cannot be used in a using-declaration

C:\Program Files\Microsoft Visual Studio 8\VC\include\cmath(18) : 错误 C2039: 'asinf' : is not a member of '`global namespace''

C:\Program Files\Microsoft Visual Studio 8\VC\include\cmath(18) : error C2873: 'asinf' : symbol cannot be used in a using-declaration

[等等等等……]

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

包括using namespace std;所有地方,或者改变我的包括的顺序似乎并没有改变任何东西。定义_STD_BEGIN解决了错误,但在< xlocinfo>.

如何解决?

4

4 回答 4

15

VC 10 中也存在同样的问题。我认为,这<cmath>包括一个math.h正确的问题,它与 VC 一起提供,它使用在用户项目中创建的问题(当然内容不同)。

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

于 2011-11-15T00:58:40.613 回答
6

我不确定我是否正确阅读了您的问题,但图书馆会运送它自己的 math.h 文件似乎很奇怪。

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

于 2010-10-21T01:18:07.737 回答
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++ 混合会导致类似的问题。

于 2013-02-06T12:25:01.397 回答
0

(1) 根据微软的说法,C2873 是指;

'symbol' : 符号不能在 using 声明中使用 using 指令缺少命名空间关键字。这会导致编译器将代码误解为 using 声明而不是 using 指令。

(2) 另外,当我使用 C2873 和 C2039(我试图合并 CEF3 和 Cinder)时,不知何故我通过更改 Properties->Configuration Properties->C/C++->Code Generation 绕过了这两个错误;

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

于 2016-02-18T06:34:26.250 回答