我有像
这样的代码#define ONE 1
#define TWO 2
#define SUM (ONE+TWO)
如何将SUM作为“3”(已解析的值)转储为gcc 4.3 +?
gcc -dM -E foo.h
似乎只是按原样转储它。如何获得在编译阶段插入的实际值?
答案 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
)停止并检查该输出。