2017-01-22 191 views
0

我正在編寫此代碼,並在嘗試編譯時出現警告。宏重新定義警告

#include <stdio.h> 
#include <math.h> 
#define EPS 1.5e-6 
#define M_PI 3.14159265358979 
int main() 
{ 
double x1,x2,xm,y1,y2,ym; 
int m; 
for(m=0;m<11;m++){ 
     x1=1.450; 
     x2=1.489; 
     y1=atan(pow(x1*x1-1.5*1.5,0.5)/pow(1.489*1.489-x1*x1,0.5))\ 
     + atan(pow(x1*x1-1.450*1.450,0.5)/pow(1.489*1.489-x1*x1,0.5))\ 
     - 4.5 * EPS * ((2 * M_PI)/(1.5 * EPS)) * pow(1.489*1.489-x1*x1,0.5)\ 
     + m*M_PI*1.5; 
     y2=atan(pow(x2*x2-1.5*1.5,0.5)/pow(1.489*1.489-x2*x2,0.5))\ 
     + atan(pow(x2*x2-1.450*1.450,0.5)/pow(1.489*1.489-x2*x2,0.5))\ 
     - 4.5 * EPS * ((2 * M_PI)/(1.5 * EPS)) * pow(1.489*1.489-x2*x2,0.5)\ 
     + m*M_PI*1.5; 
     if(y1*y2>0){ 
       printf("change initial values\n"); 
      } 
     else{ 
     while(fabs(x1-x2)>EPS){ 
     xm=(x1+x2)/2; 
     ym=atan(pow(xm*xm-1.5*1.5,0.5)/pow(1.489*1.489-xm*xm,0.5))\ 
     + atan(pow(xm*xm-1.450*1.450,0.5)/pow(1.489*1.489-xm*xm,0.5))\ 
     - 4.5 * EPS * ((2 * M_PI)/(1.5 * EPS)) * pow(1.489*1.489-xm*xm,0.5)\ 
     + m*M_PI*1.5; 
     if(y1*ym>0){ 
x1=xm; 
} 
else{ 
x2=xm; 
} 
     } 
     printf("n[%d] = %.9f;\n",m, xm); 
} 
} 
return 0; } 

的警告是:

警告: 'M_PI' 宏重新定義[-Wmacro重新定義]

我無法弄清楚如何使報警消失

+0

意味着我要改變變量的名字嗎?對不起,我對編程很陌生 –

+0

也許關於方程式的一些評論會幫助維護這些代碼的人 - 並且讓我們理解它 –

回答

1

如果有要使用宏已定義(可能定義爲一個有用的值)的可能性,那麼你可以簡單地檢查爲:

#ifndef M_PI 
# define M_PI my_value_here 
#endif 

或者,如果你不信任現有的值,你可以在這種情況下,中止翻譯:

#ifdef M_PI 
# error Macro M_PI must not be defined 
#else 
# define M_PI my_value_here 
#endif 

這似乎是GNU C library定義的宏(條件),因爲「UNIX98標準「需要他們。

1

POSIX definesM_PI作爲Pi的值作爲擴展到C標準。所以,如果你在POSIX系統上,你不需要定義你自己的M_PI

但是,如果你不想那麼你可以只編譯標準C的模式,如:

gcc -Wall -Wextra -std=c11 file.c