函数中的宏行为

Macro behavior in function

我预计下面程序的输出为 10 20,但它是 10 10。

#include <stdio.h>
#define i 10

int main()
{
printf("%d\t",i);
fun();
printf("%d",i);
return 0;
}

fun(){
    #undef i
    #define i 20
}

如果我假设如果一个函数调用 fun() 返回到 main() 那么原始的 i 值被打印然后我再次通过查看下面程序的输出错了,

#include <stdio.h>
#define i 10

fun(){
    #undef i
    #define i 20
}

int main()
{
printf("%d\t",i);
fun();
printf("%d",i);
return 0;
}

预期输出:10 20 但输出是:20 20

任何人都可以向我解释一下这种行为吗?

#define 是预处理器宏。该值在编译时而不是运行时被替换。

因此,处理是根据 #define 的存在(顺序)进行的。这意味着,您不能期望 #undef#define 在运行时工作。

具体来说,您的案例 1 代码如下所示

#include <stdio.h>
#define i 10

int main()
{
printf("%d\t",10);
fun();
printf("%d",10);
return 0;
}

fun(){
    #undef i
    #define i 20
}//now i is 20, but no one is using it, at compile time

而且,你的第二个代码看起来像

#include <stdio.h>
#define i 10

fun(){
    #undef i
    #define i 20   // i get a new definition here
}

int main()
{
printf("%d\t",20);
fun();
printf("%d",20);
return 0;
}

注意:main()的推荐签名是int main(void).

编译时的第一步是用它们的值替换所有的 PREPROCESSING TOKENS。所以评估是在编译时完成的,而不是在 运行-time.

所以你得到的第一个例子是:

#include <stdio.h>

int main()
{
  printf("%d\t",10); // we have only seen define i 10 until now
  fun();
  printf("%d",10); // we have only seen define i 10 until now
  return 0;
}

fun(){
  // the two in here would have made any i after this location be replaced with 20
}

第二个案例也类似。