宏重新定义警告
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; }
警告是:
warning: 'M_PI' macro redefined [-Wmacro-redefined]
我不知道如何让警告消失
如果您要使用的宏有可能已经定义(并且可能定义为有用的值),那么您可以简单地检查一下:
#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 standard" 需要它们。
POSIX defines一个宏M_PI
作为Pi的值作为C标准的扩展。因此,如果您使用 POSIX 系统,则无需定义自己的 M_PI
。
但是如果你不想那么你可以只在标准 C 模式下编译,例如:
gcc -Wall -Wextra -std=c11 file.c
我正在编写这段代码,当我尝试编译时出现警告。
#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; }
警告是:
warning: 'M_PI' macro redefined [-Wmacro-redefined]
我不知道如何让警告消失
如果您要使用的宏有可能已经定义(并且可能定义为有用的值),那么您可以简单地检查一下:
#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 standard" 需要它们。
POSIX defines一个宏M_PI
作为Pi的值作为C标准的扩展。因此,如果您使用 POSIX 系统,则无需定义自己的 M_PI
。
但是如果你不想那么你可以只在标准 C 模式下编译,例如:
gcc -Wall -Wextra -std=c11 file.c