有没有办法让c编译器(在我的例子中是xc16,它基于gcc)转储编译时表达式的结果?
我们有很多定义
#define FOO 37.6
#define FOO_BASE 0.035
#define FOO_FIXEDPOINT (int16_t)(FOO/FOO_BASE)
我想知道编译器将这些表达式减少到的实际数字。
请注意,这与想知道预处理器输出什么不同;预处理器不计算数学,它只在事物中进行替换。如果我看一下预处理器的输出,我得到(有效的)
#define FOO_FIXEDPOINT (int16_t)(37.6/0.035)
计算值的是编译器,而不是预处理器。
这里的另一个要点是:我确实可以自由地创建一个特殊的.c文件
#include "foo.h"
const int16_t foo_fixedpoint = FOO_FIXEDPOINT;
所以我为编译器提供了一个地方来完成它的工作并将结果作为常量。
作为一个完整的自包含示例,如果我将其放入foo.c并运行
xc16-gcc.exe -E foo.c
:#include <stdint.h>
#define FOO 37.6
#define FOO_BASE 0.035
#define FOO_FIXEDPOINT (int16_t)(FOO/FOO_BASE)
int main()
{
int x = FOO_FIXEDPOINT;
}
我得到这个输出:
[... typedefs elided ...]
int main()
{
int x = (int16_t)(37.6/0.035);
}
最佳答案
查看debugging options页面中的标志-fdump-tree-*
,查看中间语言的输出(有点低级,但可读性很强)。
您可以使用-fdump-tree-all
在不同的阶段查看文件,但您可能只需要-fdump-tree-original
。在生成的*.original
文件中向下查看以查找您的主要功能:
...
;; Function main (null)
;; enabled by -tree-original
{
int x = 1074;
int x = 1074;
}
关于c - 获取C语言中编译时表达式的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31149454/