M_PI标记为未声明的标识符

时间:2014-09-26 17:43:01

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

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

(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;
}

5 个答案:

答案 0 :(得分:52)

根据their docs

,听起来你正在使用MS的东西
  

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

所以你需要像

这样的东西
#define _USE_MATH_DEFINES
#include <cmath>

作为标题。

答案 1 :(得分:18)

默认情况下,

math.h未定义M_PI。 所以请坚持下去:

#ifndef M_PI
    #define M_PI 3.14159265358979323846
#endif

这将处理您的标头是否已定义M_PI的情况。

答案 2 :(得分:7)

GCC也支持

M_PI,但是你需要做一些工作来获得它

#undef __STRICT_ANSI__
#include <cmath>

或者如果您不想污染源文件,请执行

g++ -U__STRICT_ANSI__ <other options>

答案 3 :(得分:1)

如上文所述,您需要类似

#define _USE_MATH_DEFINES
#include <cmath>

但是您还包括iostream

iostream包含很多内容,其中之一最终包含cmath。这意味着,当您将其包含到文件中时,所有符号都已定义,因此当您将其包含在内且#define _USE_MATH_DEFINES无效时,它会被有效忽略

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

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

答案 4 :(得分:0)

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