【问题标题】:C Preprocessor output int at BuildC 预处理器在构建时输出 int
【发布时间】:2021-12-17 00:12:22
【问题描述】:

我想查看预处理器计算的输出。只有字符串才有效:

#define XSTR(x) STR(x)
#define STR(x) #x

#define BEGIN "test"

#pragma message ".text= " XSTR(BEGIN)

当我将 BEGIN 设置为 32/2 时,输出为:#pragma message: .text= 32/2。

我能做些什么来解决这个问题?我不会在 .lss 文件中搜索这样的解决方案:

uint16_t x = BEGIN;
PORTB = x>>8;
PORTA = x;

谢谢。

【问题讨论】:

  • 当您将BEGIN 定义为32/2 时,您期望输出是什么?
  • 什么是“.lss 文件”?
  • 不可能...
  • C 预处理器只会计算 #if 条件内的东西。你不会让它计算和打印一些东西(让我们忽略像 BOOST_PP 这样的可憎的东西)。另见:stackoverflow.com/questions/1560357/…
  • @JohnBollinger .lss 文件是从 AVR-GCC 生成的汇编器输出文件。值 32/2 只是一个示例。稍后计算 .text 部分。

标签: c c-preprocessor avr-gcc atmelstudio


【解决方案1】:

C 预处理器只执行文本替换。

查看折叠常量的第一个机会是在带有-fdump-tree-all 的树转储中,然后检查*.t<nnn> 转储。

要从编译器正确获取 asm 输出,请尝试 -safe-temps -fverbose-asm,它将 C 源代码作为 asm cmets 插入到 *.s 文件中。

【讨论】:

    【解决方案2】:

    我能做些什么来解决这个问题?

    您必须在预处理器中实现数学运算。例如:

    #define _div_1_over_1  1
    #define _div_2_over_1  2
    #define _div_3_over_1  3
    // etc...
    #define _div_30_over_2  15
    #define _div_31_over_2  15
    #define _div_32_over_2  16
    // etc...
    // etc. for every possible a_over_b combinations, many many 1000 lines
    #define DIV(a, b)  _div_##a##_over_##b
    

    之后,你终于可以:

    #define XSTR(x) STR(x)
    #define STR(x) #x
    
    #define BEGIN DIV(32, 2)
    
    #pragma message ".text= " XSTR(BEGIN)
    

    假设这是在预处理器中实现除法的一种方式。有关其他解决方案,请参阅 p99 库中的 BOOST_PP_DIVP99_DIV

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多