M_PI flagged as undeclared identifier

橙三吉。 提交于 2019-12-03 18:47:10

问题


When I compile the code below, I got these error messages:

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

What is this?

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

回答1:


It sounds like you're using MS stuff, according to their docs

Math Constants are not defined in Standard C/C++. To use them, you must first define _USE_MATH_DEFINES and then include cmath or math.h.

So you need something like

#define _USE_MATH_DEFINES
#include <cmath>

as a header.




回答2:


math.h not defines M_PI by default. So go with this:

#ifndef M_PI
    #define M_PI 3.14159265358979323846
#endif

This will handle both cases either your header have M_PI defined or not.




回答3:


M_PI is supported by GCC too, but you've to do some work to get it

#undef __STRICT_ANSI__
#include <cmath>

or if you don't like to pollute your source file, then do

g++ -U__STRICT_ANSI__ <other options>



回答4:


As noted by shep above you need something like

#define _USE_MATH_DEFINES
#include <cmath>

However you also include iostream.

iostream includes a lot of stuff and one of those things eventually includes cmath. This means that by the time you include it in your file all the symbols have already been defined so it is effectively ignored when you include it and the #define _USE_MATH_DEFINES doesn't work

If you include cmath before iostream it should give you the higher precision constants like M_PI

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



回答5:


I used C99 in NetBeans with remote linux host with its build tools.
Try adding #define _GNU_SOURCE and add the -lm during linking.



来源:https://stackoverflow.com/questions/26065359/m-pi-flagged-as-undeclared-identifier

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!