功能中的宏观行为

时间:2015-07-13 11:24:58

标签: c function macros c-preprocessor

我预计以下程序的输出为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值,那么通过查看以下程序的输出,我又错了/ p>

#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

有人能解释一下这种行为吗?

2 个答案:

答案 0 :(得分:1)

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

因此,处理按照#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)

答案 1 :(得分:1)

编译时的第一步是将所有PREPROCESSING TOKENS替换为其值。所以评估是在编译时完成的,而不是在运行时完成的。

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

#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
}

类似于你的第二个案例。