关于一个宏定义预编译的问题

specklelion 2016-09-10 07:50:02
#define a 10
void foo();
void prin();

int main()
{
prin();
printf("%d ", a);
foo();
printf("%d ", a);

}
void foo()
{
#undef a
#define a 50
}
void prin()
{
printf("%d ", a);
}



这段代码跑完之后 数值是50 10 10
是不是有点不可思异
网上给出的解释是define只是在预处理阶段将a替换为相应数值,具体替换的值只与define在文件中的位置有关,与是否在函数内无关
但还是无法理解
自己调了一下也调不出什么结果,请问大家能告诉我这是为什么吗?实在弄不明白
谢谢!!!
...全文
581 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
specklelion 2016-10-10
  • 打赏
  • 举报
回复
不好意思回复晚了,感谢大家的热情回答,已经完全弄清楚了! 学习了,非常感谢!
red-fly 2016-09-12
  • 打赏
  • 举报
回复
这个小程序确实容易使人弄错,比较容易把foo()看成是有功能的函数了。 从这里可以看出,对于 #define 这玩意,最好不要放到函数里,对代码的维护不利,当然如果你想故意糊弄别人,那这么干是比较好的 :) 学习了
lzpng 2016-09-12
  • 打赏
  • 举报
回复
预编译 宏替换 是按照行走的, 预编译之后 才会编译->连接->生成可执行代码 经过预编译之后的:

void foo();
void prin();
 
int main()
{
    prin();
    printf("%d ", 10);
    foo();
    printf("%d ", 10);     
}
void foo()
{
}
void prin()
{
    printf("%d ", 50);
}
  • 打赏
  • 举报
回复
code中在
void foo()
{
#undef a
#define a 50
}
后面的a就是50
赵4老师 2016-09-12
  • 打赏
  • 举报
回复
VC编译选项加/EP /P(项目、属性、配置属性、C/C++、预处理器、预处理到文件:是,预处理取消显示行号:是),重新编译,查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898
hijack00 2016-09-10
  • 打赏
  • 举报
回复
如果想深入理解宏,可以在gcc编译选项中添加-E, gcc -E xx.c会生成预编译后的中间文件(一般问文件名以.i结尾),对比你的源码和预编译结果就知道编译器究竟干了什么了
paschen 2016-09-10
  • 打赏
  • 举报
回复
宏不是按调用函数的顺序来展开,而是在你#undef上面的所有代码中的a替换的是10,#define a 50 下面所有的代码中的a是50 所以prin函数是在下面,调用他输出的是50
孤雲独去闲 2016-09-10
  • 打赏
  • 举报
回复
“宏”的关键就是"换",做任何事情之前先换,不论出不出现在函数里。因此你把程序里的a先替换成10,然后undef后替换成50就明白了。
阿卡阿卡 2016-09-10
  • 打赏
  • 举报
回复
prin中的a是50,其他函数的a是10
阿卡阿卡 2016-09-10
  • 打赏
  • 举报
回复
预处理:按a在文件中的顺序依次替换,你看看。
dustpg 2016-09-10
  • 打赏
  • 举报
回复
也就是说现在在IDE中手动将第一部分的a替换成10, 第二部分a替换成50,再编译试试. 分清楚编译时和运行时.
lm_whales 2016-09-10
  • 打赏
  • 举报
回复
预编译指令,比代码编译,优先执行 执行了预编译语句,才开始编译代码 -------- 编译跟预编译, 可能是交错执行的, 但是,凡是没有被预编译处理的,预编译指令, (包括宏调用),是不会先编译, 再进行预编译处理的,得先预编译,再编译。 ----------- 预编译语句,按照行, 而不是函数,预编译代码 编译器,是编译预编译处理过的代码 其中,sizeof 运算符,可以在预编译过程中起作用 预编译的时候,也可以对一些运算符,执行常量(表达式)的计算。
lm_whales 2016-09-10
  • 打赏
  • 举报
回复
void foo() 这个函数就是,混淆是非的 在它里面和外面效果是一致的

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧