2014-09-26 18 views
12

Khi tôi biên dịch mã dưới đây, tôi nhận được các thông báo lỗi:M_PI gắn cờ là định không khai báo

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

này là gì?

#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 không thực sự là một phần của tiêu chuẩn, do đó, không đảm bảo rằng nó đã được định nghĩa trong math.h – AndyG

+11

Và * xin vui lòng * ** xin vui lòng ** cải thiện tiêu đề của bạn. – OJFord

Trả lời

14

math.h không định nghĩa M_PI theo mặc định. Vì vậy, đi với điều này:

#ifndef M_PI 
    #define M_PI 3.14159265358979323846 
#endif 

này sẽ xử lý cả hai trường hợp một trong hai tiêu đề của bạn đã M_PI định nghĩa hay không.

40

Có vẻ như bạn đang sử dụng MS thứ, theo their docs

Math Constants không được định nghĩa trong tiêu chuẩn C/C++. Để sử dụng chúng, trước tiên bạn phải xác định _USE_MATH_DEFINES và sau đó bao gồm cmath hoặc math.h.

Vì vậy, bạn cần một cái gì đó giống như

#define _USE_MATH_DEFINES 
#include <cmath> 

như một tiêu đề.

+2

Tôi đang sử dụng Visual Studio 2013 đây là lý do tại sao không hoạt động đúng? là nó chạy trong g + +? –

+0

Thưa Eunsu, nếu bạn đi vào bên trong các tập tin đầu bên trong "Exsternal Dependencies" của Visual Studio 2013, bạn có thể thấy rằng đây là một phần của mã: '# nếu định nghĩa (_USE_MATH_DEFINES) && định nghĩa (_MATH_DEFINES_DEFINED) /* **** */ #define M_PI 3,14159265358979323846 /* **** */ #endif' Nếu bạn muốn sử dụng #define M_PI này, bạn phải xác định _USE_MATH_DEFINES với #define. Đây là lý do! – Leos313

+0

Điều đó có ý nghĩa nhưng không hiệu quả đối với tôi ... Tôi đang sử dụng Cộng đồng VS 2015 ... –

2

M_PI được hỗ trợ bởi GCC quá, nhưng bạn đã làm một số công việc để có được nó

#undef __STRICT_ANSI__ 
#include <cmath> 

hoặc nếu bạn không muốn làm ô nhiễm nguồn tập tin của bạn, sau đó làm

g++ -U__STRICT_ANSI__ <other options> 
+0

Điều này không có tác dụng nói chung – FKaria

Các vấn đề liên quan