2014-09-26 4 views
12

Когда я скомпилировать код ниже, я получил эти сообщения об ошибках:M_PI помечен как необъявленный идентификатор

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

M_PI на самом деле не является частью стандарта, поэтому не гарантируется, что он определен в math.h – AndyG

+11

И * пожалуйста * ** пожалуйста ** улучшите свой титул. – OJFord

ответ

14

math.h не определяет M_PI по умолчанию. Так что с этим:

#ifndef M_PI 
    #define M_PI 3.14159265358979323846 
#endif 

Это будет обрабатывать оба случая или ваш заголовок имеют M_PI определенные или нет.

40

Это звучит, как вы используете MS материал, в соответствии с their docs

Math Константы не определены в стандарте C/C++. Чтобы использовать их, вы должны сначала определить _USE_MATH_DEFINES, а затем включить cmath или math.h.

Так что вам нужно что-то вроде

#define _USE_MATH_DEFINES 
#include <cmath> 

в качестве заголовка.

+2

Я использую Visual Studio 2013, поэтому это не работает? он работает в g ​​++? –

+0

Уважаемый Eunsu, если вы идете в головной файл внутри «Exsternal зависимостями» в Visual Studio 2013, вы можете увидеть, что это часть кода: «#if определен (_USE_MATH_DEFINES) && определен (_MATH_DEFINES_DEFINED) /* **** */#define M_PI +3,14159265358979323846 /* **** */ #endif» Если вы хотите использовать эту #define M_PI вы должны определить _USE_MATH_DEFINES с #define. Это причина! – Leos313

+0

Это имеет смысл, но не работает для меня ... Я использую сообщество VS 2015 ... –

2

M_PI поддерживается GCC тоже, но вы, чтобы сделать какую-то работу, чтобы получить его

#undef __STRICT_ANSI__ 
#include <cmath> 

или, если вам не нравится, чтобы загрязнить ваш исходный файл, а затем сделать

g++ -U__STRICT_ANSI__ <other options> 
+0

Это не работает вообще – FKaria

Смежные вопросы