函数中的宏行为
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
}
第二个案例也类似。
我预计下面程序的输出为 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
}
第二个案例也类似。