Build 时的 C 预处理器输出 int
C Preprocessor output int at Build
我想看看预处理器计算的输出。仅适用于字符串,因此:
#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;
谢谢。
C 预处理器仅执行文本替换。
第一次看到折叠常量的机会是在 -fdump-tree-all
的树转储中,然后检查 *.t<nnn>
转储。
要从编译器正确获取 asm 输出,请尝试 -safe-temps -fverbose-asm
,它将 C 源代码作为 asm 注释混合插入 *.s
文件中。
What can i make to solve this?
您必须在预处理器中执行数学运算。例如:
#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_DIV and P99_DIV。
我想看看预处理器计算的输出。仅适用于字符串,因此:
#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;
谢谢。
C 预处理器仅执行文本替换。
第一次看到折叠常量的机会是在 -fdump-tree-all
的树转储中,然后检查 *.t<nnn>
转储。
要从编译器正确获取 asm 输出,请尝试 -safe-temps -fverbose-asm
,它将 C 源代码作为 asm 注释混合插入 *.s
文件中。
What can i make to solve this?
您必须在预处理器中执行数学运算。例如:
#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_DIV and P99_DIV。