c - 使用 C 宏创建带有 # 的字符串
问题描述
我正在使用微控制器并想编写一个插入特定数量的等待周期的宏。我想
DELAY_CYCLES(40)
扩大到
__asm(" RPT #40 || NOP");
附加限制:
由于这是特定于编译器的内在函数,因此它需要完全匹配。我不能依赖编译器来合并字符串。例如
__asm(" RPT #""40"" || NOP");
不正确。制造商标题已经定义:
#define NOP __asm(" NOP")
我不能将字符串传递给内在函数。
char str = " RPT #40 || NOP"; __asm(str);
不被允许。
目前我什至不确定这种特殊情况是否有解决方案。
解决方案
您的编译器很可能会正确连接字符串文字(尽管第 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 不允许),否则此技术不能消除#
和之间的空格。40
DELAY_CYCLES(#40)
#
40
推荐阅读
- python - 使用 xpath selenium 查找元素
- javascript - Safari 版本 12.0 (13606.2.11) 上的 popstate 事件问题
- c# - WPF 应用程序中的 Windows Identity Foundation
- mysql - MySQL:查找在一个日期(时间)有条目但在另一个日期(时间)没有条目的用户行
- css - 如何进行响应式列换行?
- java - 从 Java 访问 Kotlin 枚举
- ios - 在我的 iOS 应用程序中包含 HTTP(不是 HTTPS)URL 链接,我是否需要禁用应用程序传输安全性?
- c# - 将 Base64 转换为字符串会插入空格
- python - 如何使用python禁用windows上的printscreen键
- python - 如何提取 HDF5 数组矩阵的一部分及其对应的行属性