使用 C 宏创建带有 # 的字符串

Use C macro to create string with #

我正在使用微控制器并想编写一个宏来插入特定数量的等待周期。我要

DELAY_CYCLES(40)

扩展到

__asm(" RPT #40 || NOP");

附加限制:

  1. 因为这是一个 compiler-specific 内在函数,所以它需要完全匹配。我不能依赖编译器来合并字符串。例如。 __asm(" RPT #""40"" || NOP"); 不正确。

  2. 厂商headers已经定义:#define NOP __asm(" NOP")

  3. 我无法将字符串传递给内部函数。 char str = " RPT #40 || NOP"; __asm(str); 不允许。

目前我什至不确定是否有针对这种特殊情况的解决方案。

您的编译器很可能会正确连接字符串文字(尽管第 1 点);例如,GCC 和 Clang 将执行此操作。在这种情况下,简单的解决方案是以下宏:

#define DELAY_CYCLES(X) __asm(" RPT #" #X " || NOP");

但是,在您 确实 需要创建一个 单个 字符串的极少数情况下,您可以考虑像这样的一些 hackery:

#define A(X) __asm(#X)
#define B(X) A(X || NOP)
#define HASH #
#define DELAY_CYCLES(X) B(RPT HASH X)

DELAY_CYCLES(40) 扩展为 __asm("RPT # 40 || NOP"),即使 NOP 定义为其他内容。据我所知,#40 之间的 space 不能用这种技术省略,除非你想写 DELAY_CYCLES(#40) 或者你的预处理器允许你粘贴 #40 在一起(GCC 没有)。