我有一组目标的宏对此我想基于一个选择宏别名,像这样的宏:C预处理产生通过串联和字串
选择宏:
#define I2C_MODULE 1
别名宏(概念形式):
#define I2C_MODULE_BASE I2C<Value of I2C_MODULE>_BASE
#define I2C_MODULE_NVIC INT_I2C<Value of I2C_MODULE>
目标宏(从外部文件我的控制的):
#define INT_I2C0 24
#define INT_I2C1 53
...
#define I2C0_BASE 0x40020000
#define I2C1_BASE 0x40021000
...
我想有预处理器产生别名宏I2C_MODULE_BASE
和基于I2C_MODULE_NVIC
的 选择宏I2C_MODULE
,但喜欢读Q1,P1和许多其他参考资料后,我失去的,我结束了硬编码它们的值轨道。下面我展示我当前工作的定义,然后我上次失败的尝试在产生宏:
什么工作:
#define I2C_MODULE 1
#define I2C_MODULE_BASE I2C1_BASE
#define I2C_MODULE_NVIC INT_I2C1
什么没有奏效:
#define I2C_MODULE 1
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
/* Attempt 1 */
#define I2C_MODULE_BASE "I2C" STR(I2C_MODULE) "_BASE"
#define I2C_MODULE_NVIC "INT_I2C" STR(I2C_MODULE)
/* Attempt 2 */
#define _I2C_MODULE_BASE "I2C" STR(I2C_MODULE) "_BASE"
#define _I2C_MODULE_NVIC "INT_I2C" STR(I2C_MODULE)
#define I2C_MODULE_BASE _I2C_MODULE_BASE
#define I2C_MODULE_NVIC _I2C_MODULE_NVIC
编辑:我在扩大accepted answer去我想要的地方,如下:
#define PASTE2(a, b) a ## b
#define PASTE3(a, b, c) a ## b ## c
#define _I2C_MODULE_BASE(x) PASTE3(I2C, x, _BASE)
#define _I2C_MODULE_NVIC(x) PASTE2(INT_I2C, x)
#define I2C_MODULE_BASE _I2C_MODULE_BASE(I2C_MODULE)
#define I2C_MODULE_NVIC _I2C_MODULE_NVIC(I2C_MODULE)
什么确切的你需要什么?一个宏或一个字符串? – HuStmpHrrr 2015-03-13 14:16:48
我不明白,你为什么要处理字符串?普通的'##'标识符连接应该在这里工作得很好,但是,如果你开始嵌套这些结构,你可能会遇到评估顺序的问题 – doynax 2015-03-13 14:31:21
看看[C preprocessor和token concatenation](http://stackoverflow.com/问题/ 1489932/c-preprocessor-and-token-concatenation) - 它应该处理你的问题。 – 2015-03-13 14:43:10