我有一組目標的宏對此我想基於一個選擇宏別名,像這樣的宏: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