这些宏是如何计算的?
# define i 20
void fun();
int main(){
printf("%d",i);
fun();
printf("%d",i);
return 0;
}
void fun(){
#undef i
#define i 30
}给出了2020年的产出,但
# define i 20
void fun(){
#undef i
#define i 30
}
int main(){
printf("%d",i);
fun();
printf("%d",i);
return 0;
}输出为3030。请解释一下。谢谢。
发布于 2013-06-28 01:19:51
无论函数调用如何,C预处理器都能在自上而下的中工作。它从定义宏文件中的点(行)开始有效,直到相应的undef或翻译单元结束为止。
所以,你的代码会变成,
# define i 20
// from now on, all token i should become 20
void fun();
int main()
{
printf("%d",i); // printf("%d",20);
fun();
printf("%d",i); // printf("%d",20);
return 0;
}
void fun()
{
#undef i
// from now on, forget token i
#define i 30
// from now on, all token i should become 30
}你的第二个代码会变成,
# define i 20
// from now on, all token i should become 20
void fun()
{
#undef i
// from now on, forget i
#define i 30
// from now on, all token i should become 30
}
int main()
{
printf("%d",i); // printf("%d",30);
fun();
printf("%d",i); // printf("%d",30);
return 0;
}发布于 2013-06-28 01:20:11
根本不涉及作用域。宏是在预处理阶段独立于编译阶段处理的,没有C作用域的概念。您的示例可以很容易地实现:
#define i 20
void fun();
int main()
{
printf("%d",i);
fun();
printf("%d",i);
return 0;
}
void fun()
{
}
#undef i
#define i 30和:
#define i 20
#undef i
#define i 30
void fun()
{
}
int main()
{
printf("%d",i);
fun();
printf("%d",i);
return 0;
}你可以从这些中看出为什么它会这样做。
发布于 2013-06-28 01:20:16
根本就没有余地。
宏由预处理器替换。因此,它们的扩展是由它们在源中的位置定义的,从上到下。
https://stackoverflow.com/questions/17349387
复制相似问题