C关于宏的计算

来源:百度知道 编辑:UC知道 时间:2024/05/13 04:40:50
假设有如下代码,DEF1和DEF2分别是在什么时候计算的?是否是在编译阶段计算?如果在运行时计算,诸如DEF1这样的宏是不是会影响运行速度?请说出理由或有实验证明,麻烦各位高手!

#include <stdio.h>

#define DEF1 (10/5)
#define DEF2 (x/y)

int main()
{
int x=10, y=2;

printf("%d\n", DEF1);
printf("%d\n", DEF2);

return 0;
}
用gcc -E选项
printf("%d\n", DEF1);
printf("%d\n", DEF2);
宏被替换:
printf("%d\n", (10/5));
printf("%d\n", (x/y));

我的迷惑就在这,表达式(10/5)是由编译器在编译阶段计算的还是在运行时计算的?是否可以通过编译器优化选项控制?
再次有劳各位,谢谢!
/////////////////////////
感谢高手们的解答。
我后来查看了编译后的汇编代码,发现 DEF1 已经被替换成数值 5。可见,表达式(10/5)是由编译器在编译阶段计算的。
我用的是gcc编译器,优化为0级。

宏在预编译的时候处理,包含#的指令,都是在预编译的时候处理

相对于运行阶段,你也可以认为是编译阶段。

它只是简单的字符串替换,不是计算。

它不影响代码的执行速度,但是可能会增加代码的长度,影响最终生成的可执行文件的大小。

补充:
表达式(10/5)的计算,应该在运行的时候吧
无法通过编译选项控制这个的。

DEF1和DEF2分别是在什么时候计算的?在编译的过程中的前期进行处理的,实质为字符串替换。

宏不影响代码的执行速度,但是影响最终机器指令的长度,也就是影响最终生成的可执行文件的大小。

要实验证明的话,你可以写一个很长的宏函数,然后在很多的地方引用它;并写一个普通函数,然后把原来使用宏函数的地方改成函数调用;比较两种情况下生成的可执行文件的文件大小。

编译之前的预编译阶段进行替换的,只是简单的字符串替换,不是计算。