我有這樣的一組#define語句的:我可以使用C中的宏定義宏嗎?
#define MODULE1_PINMASK 0x1
#define MODULE2_PINMASK 0x2
#define MODULE3_PINMASK 0x3
其中pinmask的價值取決於第二個參數:
#define MODULE1_PORT_PIN A,1
#define MODULE2_PORT_PIN A,2
#define MODULE3_PORT_PIN A,3
如果在未來任何時候,我做出改變如:
#define MODULE1_PORT_PIN A,1 /* changes to #define MODULE1_PORT_PIN A,4 */
我還需要改變pinmask:
#define MODULE1_PINMASK 0x1 /* then becomes #define MODULE1_PINMASK 0x4 */
我試圖通過不必手動更改pinmask來自動化過程。到目前爲止,我已經得到了這些宏提取MODULEX_PORT_PIN的第二個參數(我不關心在這種情況下,第一個參數):如果我在函數中使用它們
#define GET_SECOND(X, Y) Y
#define GET_PIN(PORT_PIN) GET_SECOND(PORT_PIN)
,我得到正確的結果,例如:
uint8_t pinmask=0x0;
switch (GET_PIN(MODULE2_PORT_PIN))
{
case 1:
pinmask = 0x1;
break;
case 2:
pinmask = 0x2;
break;
case 3:
pinmask = 0x3;
break;
default:
break;
}
printf ("%#x", pinmask); /* prints "0x2" */
但我想保留屏蔽爲#defines。有沒有辦法實現一個#define GET_PINMASK
宏,它使用switch case來定義pinmask?我瞄準的東西是這樣的:
#define MODULE1_PINMASK ASSIGN_PINMASK(GET_PIN(MODULE1_PORT_PIN))
在這種情況下,將定義MODULE1_PINMASK爲0x1。
編輯:#define MODULE1_PORT_PIN A,1
中的第二個參數是一個uint8_t而不是十六進制值,所以我不能直接傳遞它。
在'#define MODULE1_PORT_PIN A,1'中是否有'1'(或其他什麼)被解釋爲十六進制?所以如果有'#define MODULE23_PORT_PIN A,23',那麼應該有'#define MODULE23_PINMASK 0x23'。那是對的嗎? – InternetAussie
@internetAusie,該值實際上是一個uint8,所以我不能直接傳遞它。對不起,沒有澄清,我編輯了我的帖子。 – Plesos
我不確定您是否知道以下事實:1.宏(with()以及without)只是宏預處理器中文本替換的主題。 2. 0x1 = 1,0x2 = 2,...,0x9 = 9.無論接受小數位數,十六進制數也是一樣(反之亦然)。 – Scheff