【问题标题】:M_PI flagged as undeclared identifierM_PI 标记为未声明的标识符
【发布时间】:2014-11-21 19:22:19
【问题描述】:

当我编译下面的代码时,我收到了这些错误消息:

(Error  1   error C2065: 'M_PI' : undeclared identifier 
2   IntelliSense: identifier "M_PI" is undefined)

这是什么?

#include <iostream>
#include <math.h>

using namespace std;

double my_sqrt1( double n );`enter code here`

int main() {
double k[5] = {-100, -10, -1, 10, 100};
int i;

for ( i = 0; i < 5; i++ ) {
    double val = M_PI * pow( 10.0, k[i] );
    cout << "n: "
         << val
         << "\tmysqrt: "
         << my_sqrt1(val)
         << "\tsqrt: "
         << sqrt(val)
         << endl;
}

return 0;
}

double my_sqrt1( double n ) {
int i;
double x = 1;


for ( i = 0; i < 10; i++ ) {
    x = ( x + n / x ) / 2;
}

return x;
}

【问题讨论】:

  • M_PI 实际上并不是标准的一部分,因此不能保证它已在 math.h 中定义
  • 并且please please改进你的标题。
  • @OJFord 完成,长回来即 :)

标签: c++ development-environment compile-time-constant


【解决方案1】:

根据their docs,听起来你正在使用 MS 的东西

标准 C/C++ 中未定义数学常量。要使用它们,您必须首先定义 _USE_MATH_DEFINES,然后包含 cmath 或 math.h。

所以你需要类似的东西

#define _USE_MATH_DEFINES
#include <cmath>

作为标题。

【讨论】:

  • 我正在使用 Visual Studio 2013 这就是为什么运行不正确的原因?它在 g++ 中运行吗?
  • 亲爱的 Eunsu,如果你进入 Visual Studio 2013 的“外部依赖项”中的头文件 ,你可以看到这是代码的一部分:'#if defined (_USE_MATH_DEFINES ) && !defined (_MATH_DEFINES_DEFINED) /* **** / #define M_PI 3.14159265358979323846 / **** */ #endif' 如果你想使用这个#define M_PI,你必须定义_USE_MATH_DEFINES #定义。这就是原因!
  • 这很有意义,但对我不起作用...我正在使用 VS 2015 社区...
  • 和VS2019一样,不行。
【解决方案2】:

math.h 默认没有定义M_PI

那就这样吧:

#ifndef M_PI
    #define M_PI 3.14159265358979323846
#endif

这将处理这两种情况,无论您的标头是否定义了M_PI

【讨论】:

    【解决方案3】:

    M_PI 也被 GCC 支持,但你必须做一些工作才能得到它

    #undef __STRICT_ANSI__
    #include <cmath>
    

    或者如果你不想污染你的源文件,那么就这样做

    g++ -U__STRICT_ANSI__ <other options>
    

    【讨论】:

    • 非常感谢!我知道这是一篇旧帖子,但我想知道为什么会这样。我是 C++ 新手。
    • C++ 头文件有宏、包含、变量、函数和类——声明、定义或两者兼有。现在取决于几个标志(查找条件编译),预处理器包括/排除它们。严格来说,C++ 标准不强制要求M_PI,因此 GCC 的标头默认不包括其定义。如果有人需要它,他们必须通过取消定义排除它的守卫来请求它,即__STRICT_ANSI__。您可以在编译器的 math.hcmath 的原始 C 标头)中搜索 M_PI,然后您会看到围绕它的防护措施。希望能回答你的问题。
    • 在 Win10 + Msys2 Portable 下为我工作。
    【解决方案4】:

    正如上面的 shep 所说,您需要类似的东西

    #define _USE_MATH_DEFINES
    #include <cmath>
    

    但是,您还包括iostream

    iostream 包含很多东西,其中之一最终包含cmath。这意味着当您将其包含在文件中时,所有符号都已定义,因此当您包含它并且 #define _USE_MATH_DEFINES 不起作用时,它实际上会被忽略

    如果您在iostream 之前包含cmath,它应该会为您提供更高精度的常量,例如M_PI

    #define _USE_MATH_DEFINES
    #include <cmath>
    #include <iostream>
    

    【讨论】:

      【解决方案5】:

      将此包含用于 Windows 10:

      #include <corecrt_math_defines.h>
      

      【讨论】:

        【解决方案6】:

        我在带有远程 linux 主机的 NetBeans 中使用 C99 及其构建工具。
        尝试添加#define _GNU_SOURCE 并在链接期间添加-lm

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-30
          • 1970-01-01
          • 2012-11-13
          • 2021-06-07
          • 2016-04-09
          相关资源
          最近更新 更多