簡體   English   中英

預處理器宏替換

[英]Preprocessor macros substitution

#define LED1_ON() { /* twiddle port bit */ }
#define LED2_ON() { /* twiddle port bit */ }
//  ...
#define LED9_ON() { /* twiddle port bit */ }

#define LED_ON(x) LED##x_ON()

我想使用上面的代碼(或類似的東西)來(例如) LED_ON(1)調用宏LED1_ON()LED_ON(2)調用宏LED2_ON()

我相信有可能讓cpp這樣做,但顯然我沒有正確的語法。 有沒有人知道使這成為可能的語法?

在我調用LED_ON(2) ,gcc給出錯誤消息:

undefined reference to `LEDx_ON'

您需要將LED_ON定義為

#define LED_ON(x)  LED##x##_ON()

你想把參數x和粘貼在一個LED前綴和一個_ON后綴上。

我認為不應該過度使用預處理器機制。 如果一些更嚴重的邏輯開始出現在宏中,也許是時候切換到內聯函數了? 它們更具可讀性,同樣快速,功能更強大,如果參數類型為aso,您可以從編譯器獲得一些幫助。

如果您堅持使用#define LED_ON(x)宏,后續LED由一個端口的后續位控制,您可以嘗試這樣的方法:

#define LED_ON(x)   SetBit(port, 1<<x);

做這樣的事情

#define LED_ON(num) \
    void LED_ON##num() \
    {\
        printf("set the bit for %d\n", num); \
    }\

LED_ON(1) 
LED_ON(2)

int main() {
    LED_ON1();
    LED_ON2();
}

LED_ON(1)和LED_ON(2)將擴展為全功能,名稱為LED_ON1()和LED_ON2(),調用功能為LED_ON1()LED_ON2()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM