【问题标题】:Way to print out compile-time -calculated constants打印出编译时计算的常量的方法
【发布时间】:2013-09-15 01:38:57
【问题描述】:

我正在做一些微控制器编程,并且我有如下代码:

#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 功能。

【问题讨论】:

  • 我假设您并不是要在 #define 语句中包含 = 符号。 ;) 而且,不幸的是,预处理器将定义替换为字符串并且不计算它们。算术由实际编译器完成,结果仅在编译结果中。虽然我不知道是否有一个工具可以在某处进行计算。
  • 这并不完全符合您的要求,但如果您知道至少几种可能的后评估值组合,您可以尝试这里讨论的内容:stackoverflow.com/questions/1560357/…
  • 修复了#defines中的=;我已经有一段时间没有写任何 C 了! (试图即时制作一个简单的示例,而不仅仅是复制我的代码。)
  • 对于 VC++ 用户,有 VC++ 技巧可以在不依赖编译错误的情况下打印编译时间常数:在此处查看我的答案:stackoverflow.com/questions/28852574/…

标签: c gcc microcontroller


【解决方案1】:

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

const float temp = T_ADC;

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

【讨论】:

  • 这听起来像是朝着我的目标前进,我已经切换到 const 声明以避免意外与 float #define 进行比较(并触发编译器插入浮点引擎)。
【解决方案2】:

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

/* 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

【讨论】:

  • 我真的不明白它会有什么帮助
  • 他想在编译时对预处理器标记进行算术运算,而不是完全按照它们出现的样子打印出来。
  • 由于预处理器只进行字符串替换,实际上并没有办法打印出它们的评估结果。我试图理解但显然完全被忽略的是,您可以在编译之外自行进行计算。
【解决方案3】:

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

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

  • 做起来很乏味,因为它与以下因素成正比:-
    • 所需的位数/类别数
    • 无法共享的变量数
  • 相当特定于预处理器
  • 没有任何编译器检查

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多