在C中获取编译时表达式的值

Jas*_*n S 16 c gcc

有没有办法让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)