宏观扩张

基本问题

#define A 5 #define B 10 #define C (A*B) int var; var = C; 

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

 var = (5*10) 

要么

 var = (50) 

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

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

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

宏只是文本替换,其中预编译器只是将宏替换为其定义的值。 因此,一旦宏被其定义替换,编译器将评估这些操作。 进一步的编译器可以优化它们如何处理表达式,例如(5*10)编译器遵循As-If优化规则,其中它们可以直接替换(5*10) 50因为这不会改变程序的可观察行为。

预处理器的输出为(5*10) 。 编译器负责执行计算,或者在这种情况下是常量折叠表达式。

可能是它的预处理器依赖。 由于编译器进行优化,因此预处理器可能只进行替换。

我的gcc版本i686-apple-darwin10-gcc-4.2.1将其显示为选项1

 var = (5*10) 

你可以使用-E flag选项来检查

喜欢

 gcc -E test.c 

预编译器将宏扩展为var =(5 * 10)

但是,对于任何现代编译器,编译器几乎肯定会将其优化为等效var = 50。

您应该能够将编译器设置为输出预编译的代码,以便您可以看到宏扩展。

宏扩展后它将是(5 * 10),但在此之后,编译器将使用50进行优化。