如何創建一個C宏以獲取字符串的整數值?具體使用案例來自here。我想改變這樣的代碼:使用C預處理獲取字符串的整數值
enum insn {
sysenter = (uint64_t)'r' << 56 | (uint64_t)'e' << 48 |
(uint64_t)'t' << 40 | (uint64_t)'n' << 32 |
(uint64_t)'e' << 24 | (uint64_t)'s' << 16 |
(uint64_t)'y' << 8 | (uint64_t)'s',
mov = (uint64_t)'v' << 16 | (uint64_t)'o' << 8 |
(uint64_t)'m'
};
要這樣:
enum insn {
sysenter = INSN_TO_ENUM("sysenter"),
mov = INSN_TO_ENUM("mov")
};
凡INSN_TO_ENUM
擴展到相同的代碼。性能會一樣,但可讀性會提高很多。
我懷疑,在這種形式可能不是因爲C預處理器的無力字符串處理的是可能的,所以這也將是一個不優選的,但可以接受的解決方案(可變參數宏):
enum insn {
sysenter = INSN_TO_ENUM('s','y','s','e','n','t','e','r'),
mov = INSN_TO_ENUM('m','o','v')
};
在這一點上,我會寫我自己的預處理器。試圖按照自己的方式去做就會變得非常痛苦。用你最喜歡的腳本語言編寫一個簡單的腳本。假設你的枚舉在一段時間內是相對靜態的(即你不是日復一日地編輯它們),那麼我認爲這將是方便和可讀的。 – 2012-03-02 15:13:04
@DavidHeffernan:我已經考慮過了,但作爲最後的手段。如果它可以作爲一個宏來實現,我們就具有可讀性的優點,並且能夠抽象/隱藏這個特定的實現細節。國際海事組織的優勢勝過通過「預處理」產生的選項。 – 2012-03-02 15:18:48
我不確定宏是否可以處理變量參數,或者只是接受它來傳遞它。看到我的答案爲1的論點之一。 – Shahbaz 2012-03-02 15:24:14