【问题标题】:cmath.h and compile errorscmath.h 和编译错误
【发布时间】:2011-04-28 08:42:46
【问题描述】:

我曾经使用 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) : error 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> 中产生了同样多的错误。

如何解决?

【问题讨论】:

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

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


【解决方案1】:

VC 10 中存在同样的问题。我认为,<cmath> 本身包含一个 math.h,但插入了正确的一个,它随 VC 一起提供,它使用在用户项目中创建的一个(具有不同的当然是内容)。

解决方案:切勿在您的项目中使用名为 math.h 的文件...(或在某处更正 std)。

【讨论】:

  • 在扯掉我的头发 2 小时后,您的评论让我发现我的项目中有一个 Math.h,即使与 std 的 math.h 不同的大小写冲突。将我的 Math.h 重命名为 MathExtensions.h 解决了这个问题。谢谢!
  • 现在“数学”出现在我的简短“源文件不应该被命名为这个”列表中。 (我有一个较长的“源文件不应该有包含此字符串的名称”列表,其中包含“错误”、“警告”和“失败”。)
  • VS 2015 和 VS 2017 RC 上存在问题。将 Math.h 重命名为 ProjectnameMath.h 即可解决。
【解决方案2】:

我不确定我是否正确阅读了您的问题,但库会提供它自己的 math.h 文件似乎很奇怪。

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

【讨论】:

    【解决方案3】:

    问题可能在于将 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++ 混合会导致类似的问题。

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-10-12
        • 2011-10-12
        • 2018-02-01
        • 2017-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多