宏观扩张

时间:2011-12-09 15:54:56

标签: c

基本问题

#define A 5
#define B 10

#define C (A*B)


int var;
var = C;

所以这里将如何扩展宏,是吗

var = (5*10)

var = (50)

我怀疑宏观扩张。如果宏在所有常量上都有一些计算(*, - ,/,+),那么marco只是一个在线扩展,或者它将评估结果并发布它

7 个答案:

答案 0 :(得分:4)

宏扩展始终只是输入源代码的文本转换。您应该能够在预处理器(完成宏扩展的编译部分)完成后看到代码;这个文本是编译器适当的工作原理。

但是许多编译器在编译期间进行“常量折叠”优化,这将优化5 * 1050,这样就不需要在运行时进行计算。

答案 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