c - c中其他宏串联内的宏串联

标签 c concatenation

我有以下宏:

#define    __IR( x )        ICU.IR[ IR ## x ].BIT.IR
#define     _IR( x )        __IR( x )
#define      IR( x , y )    _IR( _ ## x ## _ ## y )

我是这样使用的:

IR(SCI7, RXI7) = 0;

扩展为:

ICU.IR[ IR_SCI7_RXI7 ].BIT.IR = 0

我不想使用 SCI7RXI7,而是使用 sci(channel)rxi(channel)。所以我尝试创建以下宏:

#define _sci(x)  SCI ## x
#define  sci(x)  _sci(x)
#define _rxi(x)  RXI ## x
#define  rxi(x)  _rxi(x)

#define channel 7

然后:

IR(sci(channel), rxi(channel)) = 0;

但是没有用。编译器返回给我:

Error[Pe017]: expected a "]"

我也一直在尝试其他方式,但没有成功。

我做错了什么?

最佳答案

整个宏用文字子表达式扩展,然后扩展结果表达式中的宏。

所以你可以这样写:

#define    __IR(x )      ICU.IR[ IR ## x ].BIT.IR
#define     _IR(x, y)    __IR(_ ## x ## _ ## y)
#define      IR(x, y)    _IR(x, y)

#define _sci(x)  SCI ## x
#define  sci(x)  _sci(x)
#define _rxi(x)  RXI ## x
#define  rxi(x)  _rxi(x)

#define channel 7

IR(sci(channel), rxi(channel)) = 0;

(我唯一真正改变的是 _IR 的定义。另外请注意,宏标识符和以下划线开头的符号是为编译器保留的,因此您可能想重命名您的辅助标识符宏。)

关于c - c中其他宏串联内的宏串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848738/

相关文章:

java - 字符串操作每 4 个字符插入一个字符

Mysql 查询在新字段中连接未知数量的值

SQL - Concat 全名,只有在姓氏存在时才包含空格

c - Vulkan API 和 C - 查询物理设备属性导致段错误

c - 为什么 fwrite 写的比我告诉它的要多?

C 应用程序 (Linux) 的 C# (Mono) 测试意外修改属性

c - 排序数组问题

c - 使用命名管道的 C 中的 IPC

SQL - 使用 Group By 时以逗号分隔数据

python - numpy 在 tensorflow 上的 hstack 用于单个矩阵/张量