基本问题
#define A 5
#define B 10
#define C (A*B)
int var;
var = C;
所以这里将如何扩展宏,是吗
var = (5*10)
或
var = (50)
我怀疑宏观扩张。如果宏在所有常量上都有一些计算(*, - ,/,+),那么marco只是一个在线扩展,或者它将评估结果并发布它
答案 0 :(得分:4)
宏扩展始终只是输入源代码的文本转换。您应该能够在预处理器(完成宏扩展的编译部分)完成后看到代码;这个文本是编译器适当的工作原理。
但是许多编译器在编译期间进行“常量折叠”优化,这将优化5 * 10
到50
,这样就不需要在运行时进行计算。
答案 1 :(得分:4)
可能是它的预处理器依赖。由于编译器进行了优化,因此预处理器可能只进行替换。
我的gcc版本i686-apple-darwin10-gcc-4.2.1
将其显示为选项1
var = (5*10)
您可以使用-E
标记选项来检查
像
gcc -E test.c
答案 2 :(得分:2)
宏只是文本替换,其中预编译器只是将宏替换为其定义的值。因此,一旦宏被其定义替换,编译器将评估这些操作。进一步的编译器可以优化他们如何处理表达式,例如(5*10)
编译器遵循 As-If 优化规则,其中他们可以直接将(5*10)
替换为50
,因为那样做不要改变程序的可观察行为。
答案 3 :(得分:2)
预处理器的输出为(5*10)
。编译器负责执行计算,或者在这种情况下是常量折叠表达式。
答案 4 :(得分:0)
预编译器将宏扩展为var =(5 * 10)
然而,对于任何现代编译器,编译器几乎肯定会将其优化为等效的var = 50。
您应该能够将编译器设置为输出预编译的代码,以便您可以看到宏扩展。
答案 5 :(得分:0)
在宏扩展后它将是(5 * 10),但在此之后,编译器将使用50优化它。
答案 6 :(得分:0)
宏可用于通过减少编译时需要完成的工作量来优化代码。
在这里,它通过将5*10
替换为50
来减少运行时间,这两个结果都是相同的。
它通过BODMAS方法执行数学运算。
例如:
#定义MULTIPLY(a,b)a * b
乘(10 + 2,6 + 5)
结果是10 + 2 * 6 + 5 = 27