有没有办法让C编译器(在我的情况下是XC16,基于gcc)转储编译时表达式的结果?
我们有很多#defines之类的
#define FOO 37.6
#define FOO_BASE 0.035
#define FOO_FIXEDPOINT (int16_t)(FOO/FOO_BASE)
Run Code Online (Sandbox Code Playgroud)
我想知道编译器将这些表达式减少到的实际数字.
请注意,这是不一样的东西想知道什么预处理器输出; 预处理器不计算数学,它只能替代事物.如果我查看预处理器输出,我得到(有效)
#define FOO_FIXEDPOINT (int16_t)(37.6/0.035)
Run Code Online (Sandbox Code Playgroud)
它是编译器,而不是预处理器,它可以计算出一个值.
另一个重要的一点是:我可以自由地创建一个特殊的.c文件
#include "foo.h"
const int16_t foo_fixedpoint = FOO_FIXEDPOINT;
Run Code Online (Sandbox Code Playgroud)
这样我就可以为编译器提供一个工作位置并将结果作为常量.
就像一个完整的自包含示例,如果我把它放到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;
}
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
[... typedefs elided ...]
int main()
{
int x = (int16_t)(37.6/0.035);
}
Run Code Online (Sandbox Code Playgroud)
小智 16
退房的标志-fdump-tree-*在调试选项页面,看到中间语言(有点低的水平,但相当的可读性)的输出.
您可以使用-fdump-tree-all在不同阶段查看文件,但可能只需要-fdump-tree-original.在生成的*.original文件中向下看,以查找您的主要功能:
...
;; Function main (null)
;; enabled by -tree-original
{
int x = 1074;
int x = 1074;
}
Run Code Online (Sandbox Code Playgroud)