为什么宏的值在被调用函数中没有变化?

Sim*_*rao -1 c macros

我在一个C aptitude问题网站上遇到了一个程序

#define i 20

void fun();

int main(void)
{
    printf("%d..",i);
    fun();
    printf("%d",i);       
}

void fun() {
#undef i;
#define i 30
} 
Run Code Online (Sandbox Code Playgroud)

输出来了

20..20
Run Code Online (Sandbox Code Playgroud)

但据我说它应该是

20..30
Run Code Online (Sandbox Code Playgroud)

为什么i 电话后没有变成30 的价值fun()

#define i 20

void fun();
 int main(void)
 {
 printf("%d..",i);
 #define i 50       
 printf("%d",i);       
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我编译并运行上面的程序,输出变为20..50所以现在宏值如何在运行时更改.

Iha*_*imi 5

无法在运行时更改宏.在您的程序中,宏在编译之前由预处理器更改一次,因此它在编译的程序中的值是30.

你可以在这里阅读它.

void fun() {
#undef i;
#define i 30
}
Run Code Online (Sandbox Code Playgroud)

实际上将是一个空函数,预处理程序将是

void fun();
int main(void)
{
    printf("%d..",20);
    fun();
    printf("%d",20);
}
void fun() {
}
Run Code Online (Sandbox Code Playgroud)

所以你可以看到输出是正确的.

要生成上述预处理程序,您可以使用它gcc

gcc -E -P source.c
Run Code Online (Sandbox Code Playgroud)

实际上是一个空函数

  • 在运行之前,甚至在编译器看到代码之前,宏也会被替换(如在纯文本替换中).如果重新定义宏,则其值将更改为代码文件中比重定义更低的所有代码,但不会更改之前的任何代码.如果你把'printf("%d \n",i); 在第二个`#define`之后的`fun`中,你将得到输出`20 50 20`. (3认同)