2017-01-22 9 views
0

Я пишу этот код и появляется предупреждение, когда пытаюсь скомпилировать.Macro Redefined Warning

#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 defines a макрос M_PI как значение Pi как расширение стандарта C. Итак, если вы находитесь в системе POSIX, вам не нужно определять свой собственный M_PI.

Но если вы не хотите, то вы можете скомпилировать только в стандартном режиме C, таких как:

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