我正在做一些微控制器编程,我有这些代码:
#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功能。
答案 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但是: -
由于我没有代码,所以练习/乏味留给读者......
*使用基于缩放整数的计算