M_PI标记为未声明的标识符

Eun*_*Kim 28 c++ development-environment compile-time-constant

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

(Error  1   error C2065: 'M_PI' : undeclared identifier 
2   IntelliSense: identifier "M_PI" is undefined)
Run Code Online (Sandbox Code Playgroud)

这是什么?

#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;
}
Run Code Online (Sandbox Code Playgroud)

She*_*hep 55

根据他们的文档,听起来你正在使用MS的东西

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

所以你需要类似的东西

#define _USE_MATH_DEFINES
#include <cmath>
Run Code Online (Sandbox Code Playgroud)

作为标题.

  • 我使用的是Visual Studio 2013,这就是为什么运行不正常?它是用g ++运行的吗? (5认同)
  • 这很有意义,但对我不起作用...我正在使用VS 2015社区... (2认同)
  • 在VS 2017社区中对我不起作用 (2认同)

Hem*_*war 20

math.hM_PI默认情况下不定义.所以顺其自然:

#ifndef M_PI
    #define M_PI 3.14159265358979323846
#endif
Run Code Online (Sandbox Code Playgroud)

这将处理您的标头已M_PI定义或未定义的两种情况.


leg*_*s2k 9

M_PI 海湾合作委员会也支持,但你要做一些工作才能得到它

#undef __STRICT_ANSI__
#include <cmath>
Run Code Online (Sandbox Code Playgroud)

或者如果你不喜欢污染你的源文件,那就去做吧

g++ -U__STRICT_ANSI__ <other options>
Run Code Online (Sandbox Code Playgroud)


Met*_*ton 7

正如上面shep所指出的,你需要类似的东西

#define _USE_MATH_DEFINES
#include <cmath>
Run Code Online (Sandbox Code Playgroud)

但是,您还包括iostream.

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

如果你cmathiostream它之前包含它应该给你更高精度的常量,比如M_PI

#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
Run Code Online (Sandbox Code Playgroud)


Pat*_*oom 7

对于 Windows 10(和 Windows 11)使用此包含:

#include <corecrt_math_defines.h>
Run Code Online (Sandbox Code Playgroud)