首页 > 解决方案 > 使用 C 宏创建带有 # 的字符串

问题描述

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

DELAY_CYCLES(40)

扩大到

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

附加限制:

  1. 由于这是特定于编译器的内在函数,因此它需要完全匹配。我不能依赖编译器来合并字符串。例如__asm(" RPT #""40"" || NOP");不正确。

  2. 制造商标题已经定义:#define NOP __asm(" NOP")

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

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

标签: cc-preprocessor

解决方案


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

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

但是,在极少数情况下,当你真的需要创建单个字符串时,你可能会考虑一些像这样的骇客:

#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定义为其他东西。据我所知,除非您想编写或您的预处理器允许您粘贴和在一起(GCC 不允许),否则此技术不能消除#和之间的空格。40DELAY_CYCLES(#40)#40


推荐阅读