gcc dump已解析定义

时间:2011-09-27 18:53:53

标签: c gcc

我有像

这样的代码
#define ONE 1
#define TWO 2
#define SUM (ONE+TWO)

如何将SUM作为“3”(已解析的值)转储为gcc 4.3 +?

gcc -dM -E foo.h似乎只是按原样转储它。如何获得在编译阶段插入的实际值?

4 个答案:

答案 0 :(得分:2)

你做不到。就编译器而言,预处理之前的行printf("%d\n", SUM)与行printf("%d\n", 1+2)无法区分。即使在默认优化级别(-O0),编译器恰好也会执行名为constant folding的优化,这会在运行时将结果转换为常量3。

看到这些优化的输出并不是一个好方法。您可以使用-S选项查看生成的汇编代码并查看它的外观,但如果您的程序比玩具大,那将需要大量的手动操作。您还可以使用-fdump-tree选项之一查看解析树(请参阅GCC手册页)。

答案 1 :(得分:1)

您无法将SUM“转储”为3,因为SUM在任何有意义的意义上都不是3,它只是三个标记的序列ONE,{{1} }和+。它变成什么取决于它扩展的背景。

宏在它们出现在源中的地方展开,宏替换只是令牌的字符串直到那时。

你可以这样测试。

TWO

这是另一个例子:

#include <stdio.h>

#define ONE 1
#define TWO 2
#define SUM ONE+TWO
int a = SUM;
#undef ONE
#define ONE 2
int b = SUM;

int main()
{
     printf("a = %d\nb = %d\n", a, b);
     return 0;
}

通过此示例,您无法证明#include <stdio.h> #define ONE 1 #define TWO 2 #define SUM ONE+TWO int main() { /* prints 6, not 2 */ printf("5 - SUM = %d\n", 5 - SUM); return 0; } SUM

答案 2 :(得分:1)

与其他答案相反,肯定有这个问题的解决方案,尤其是gcc扩展。解析gcc -dM的输出并生成包含__typeof__(MACRO) foo = MACRO;形式的行的C文件并从那里开始。如果没有__typeof__,您只需使用long double即可完全处理所有算术类型。

答案 3 :(得分:0)

一种方法是在预编译器阶段(-E)停止并检查该输出。