打印出编译时计算常量的方法

时间:2013-09-15 01:38:57

标签: c gcc microcontroller

我正在做一些微控制器编程,我有这些代码:

#define F_CPU 8000000
#define F_ADC (F_CPU / 64.0)
#define T_ADC (1.0/F_ADC)

有没有办法在编译时打印出T_ADC的计算值?我试着把它串起来

#define STRINGIFY(s) XSTRINGIFY(s)
#define XSTRINGIFY(s) #s
#pragma message ("T_ADC " STRINGIFY(T_ADC)) 

但这只是给出了宏观扩张“(1 /(8000000/64))”,而不是实际价值。

这是一个微控制器程序,在启动时执行printf很尴尬。我正在使用gcc,如果有帮助,我很乐意使用任何非标准的gcc功能。

3 个答案:

答案 0 :(得分:1)

正如@mbratch和@freddie所说,计算是由编译器完成的,所以你不能简单地使用预处理器指令来获得结果。 现在想到的最简单的方法是将宏分配给全局const,然后使用调试器读取const的值,或者打开可执行文件的二进制映像(可以从中获取常量的地址)内存映射文件)。

const float temp = T_ADC;

请注意,您必须指定C类型,这是必不可少的步骤,因为宏的结果取决于它。

答案 1 :(得分:0)

这不是你想要的,但它会有所帮助。

/* definition to expand macro then apply to pragma message */
#define VALUE_TO_STRING(x) #x
#define VALUE(x) VALUE_TO_STRING(x)
#define VAR_NAME_VALUE(var) #var "="  VALUE(var)

#define F_CPU  8000000
#define F_ADC  (F_CPU / 64.0)
#define T_ADC  (1.0/F_ADC)

#pragma message VAR_NAME_VALUE(T_ADC) /* prints  note: #pragma message: T_ADC=(1.0/(8000000 / 64.0) */

这称为Stringification

编辑:预处理器只进行字符串替换。您可以使用pragma消息,然后使用简单的脚本来执行计算。继续我上面的评论。

$ gcc a.c 2> out
$ python -c "print `cat out | cut -d = -f2`"
8e-06

答案 2 :(得分:0)

我在预处理器中为微控制器实现了波特率计算,但调整了整数除法,使其四舍五入(因为截断有更多错误)。然后我在low,med和too的一系列类别中显示了已实现的错误,但由于额外繁琐的编码工作,我没有达到+ -X.X%*。

这是http://99-bottles-of-beer.net/language-c-c++-preprocessor-115.html但是: -

  • 这很乏味,因为它与以下方面成正比: -
    • 所需的位数/类别数
    • 可以共享任何内容的变量数
  • 相当预处理器
  • 没有任何编译器检查

由于我没有代码,所以练习/乏味留给读者......

*使用基于缩放整数的计算