我在一个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所以现在宏值如何在运行时更改.
无法在运行时更改宏.在您的程序中,宏在编译之前由预处理器更改一次,因此它在编译的程序中的值是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)
实际上是一个空函数