【发布时间】:2017-07-08 19:36:13
【问题描述】:
我正在为微控制器编写一些库,为此,我使用了类似宏的函数。例如,启用 I2C 模块的类宏函数定义为:
#define I2C_MODULE_ENABLE(_x) \
I2C##_x##CONLbits.I2CEN = 1
_x 是模块编号(例如,1 或 2 在我的例子中)。
如果用户将此类似宏的函数称为I2C_MODULE_ENABLE(1),则预处理器会将其扩展为I2C1CONLbits. I2CEN = 1。
但是,如果用户将此类似宏的函数称为 I2C_MODULE_ENABLE(MY_I2C),其中 MY_I2C 是在用户定义的 config.h 文件中定义的宏常量,该文件包含在我的 i2c.h 库中(例如,宏常量定义为#define MY_I2C 1),类宏函数将扩展为I2CMY_I2CCONLbits. I2CEN = 1。
我知道我需要在连接之前以某种方式评估 MY_I2C 宏常量,我可以通过添加另一个宏级别来做到这一点:
#define __I2CxCONLbits(_x) I2C##_x##CONLbits
#define I2C_MODULE_ENABLE(_x) \
__I2CxCONLbits.I2CEN = 1
我的问题是:是否有更优雅的解决方案来解决这个问题,因为我有多个寄存器,例如 CONLbits 寄存器。使用这种方法,我需要为每个寄存器定义一个特殊的 __I2CxREGISTER(_x) 宏。
我试图做这样的事情:
#define __I2Cx(_x) I2C##_x
#define I2C_MODULE_ENABLE(_x) \
__I2Cx(_x)##CONLbits.I2CEN = 1
但这会产生如下输出:I2C1 CONLbits .I2CEN = 1,而我的编译器抱怨 I2C1 和 CONLbits 标记之间的空格。
【问题讨论】:
标签: c macros header-files libraries