【发布时间】:2020-12-08 06:59:21
【问题描述】:
我正在使用微控制器并想编写一个插入特定数量的等待周期的宏。我想要
DELAY_CYCLES(40)
展开到
__asm(" RPT #40 || NOP");
附加限制:
-
由于这是特定于编译器的内在函数,因此它需要完全匹配。我不能依赖编译器来合并字符串。例如。
__asm(" RPT #""40"" || NOP");不正确。 -
制造商标头已定义:
#define NOP __asm(" NOP") -
我无法将字符串传递给内在函数。不允许使用
char str = " RPT #40 || NOP"; __asm(str);。
目前我什至不确定是否有解决这种特殊情况的方法。
【问题讨论】:
-
快速提问:你试过
__asm(" RPT #""40"" || NOP");吗?大多数编译器中的 __asm 语法都可以很好地处理这个问题。 -
@nneonneo 实际上不,我认为它不会起作用。我会试试。也许编译器比我想象的要聪明。
-
这不是“聪明”的问题。字符串在预处理期间被连接,然后被解析。如果你打算用宏做一些奇怪的事情,你应该从学习如何使用预处理器开始,包括翻译的不同阶段。
-
@Sneftel 错误,迂腐修正,但它是处理字符串合并的编译器。预处理器不这样做。 (自己检查:
echo 'char *x = "a""b";' | gcc -xc -E -;这会打印出char *x = "a""b";) -
@nneonneo 它确实会影响字符串解析。例如。
"\x1234"是无效的转义序列,但"\x12""34"可以编译。
标签: c c-preprocessor