标题: 请教 关于C语言宏定义的问题 [打印本页]

作者: dzbj    时间: 2020-1-11 14:46
标题: 请教 关于C语言宏定义的问题
比如 在keil中 我定义这样一个宏
#define a  1+2


调用时
x=a;

问题

运算过程是 x=3 还是 x=1+2

我理解应该是x=1+2 就是说每次调用a都会进行一次1+2的运算

但这两天看书说 define在编译时就运算完了 要是按书里的说法理解 每次调用a 应该直接就是3而不进行1+2运算

有点糊涂了 应该是哪个

作者: 1402354830    时间: 2020-1-11 15:11
编译时就已经运算完了。
作者: qiuaqiuqiu    时间: 2020-1-11 17:16
我觉得是第二个,宏定义本身是对程序中特殊命令的预处理,经过预处理后程序就不再包括预处理命令了,最后再由编译程序时——预处理——源程序进行编译处理,得到可供执行的目标代码。所以是x直接是3,a还是1+2,但是在预处理中完成的。
作者: z77889900111    时间: 2020-1-11 17:27
宏定义就是把定义的宏在程序运行时直接替换  在程序编译的时候a被替换成1+2  所以就变成x=1+2
作者: tyrl800    时间: 2020-1-11 18:18
就是x=3
作者: zhai1995    时间: 2020-1-11 19:46
原样替换  ,你理解应该是对的

作者: zhai1995    时间: 2020-1-11 19:58
你可以自己 验证的 ,  #define a  1+4       然后  x = a/4;     打印看结果多少   就知道是先加等于5   还是原样替换了。
作者: yoxi    时间: 2020-1-11 19:58
你这是偷懒!这样的疑问完全是自己可以在C编程器中去验证的事!
作者: dzbj    时间: 2020-1-11 21:29
zhai1995 发表于 2020-1-11 19:58
你可以自己 验证的 ,  #define a  1+4       然后  x = a/4;     打印看结果多少   就知道是先加等于5    ...

欧了 你这个方法好 我试试
作者: dzbj    时间: 2020-1-11 22:09
感谢楼上各位前辈的回复 特别感谢7楼的回复 根据你的建议我验证了一下 情况如下

第一种

#define a 4+4

uchar x;

x=a/4;

结果 x=5

说明是直接替换

第二种
#define a 4+4
uchar b=a;
uchar x=0;

x=b/4;
x=2;

说明编译时已经运算过了

我这么表达可能不太准确 就是说直接调用宏定义的东西 就是直接替换 写什么进去就直接替换成什么 但如果把宏声明给一个变量 在编译时会直接把宏的值运算出来给变量

作者: 工具人2000    时间: 2020-1-12 01:23
我觉得应该是x=1+2
作者: hantu    时间: 2020-1-12 11:31
宏定义在预编译阶段只是查找替换




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1