看板 C_and_CPP 關於我們 聯絡資訊
#define FOO_VALUE 5 #define N5 ~,1 #define N11 ~,1 #define N18 ~,1 #define N21 ~,1 #define N29 ~,1 #define Result1 1//5,11,18,21,29 #define Result0 //其他,0對應到TEST的n #define TEST(x,y,n) _TEST(x,y,n)//在串接前先展開x與y #define _TEST(x,y,n) __TEST(x##y,n) #define __TEST(x,n) ___TEST(x,n)//須多展開一次,不定參數先確認參數數量才展開參數 #define ___TEST(d,n,...) n #define CAT(a,b) _CAT(a,b) #define _CAT(a,b) a##b //上面的code可以獨立出來包在header內 #if CAT(Result,TEST(N,FOO_VALUE,0)) > 0 //不做任何事,Result0會導致編譯錯誤 #endif 這樣可以在局部開放5,11,18,21,29以外的值 透過新增NXX的定義即可,不必再去改header,區塊結尾再undef -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.171.20.220 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1499761003.A.16F.html ※ 編輯: loveflames (118.171.20.220), 07/11/2017 16:22:46
Hazukashiine: 底線後面接大寫字母是保留給編譯器實作的 盡量避免 07/11 18:25
Hazukashiine: #define Result0 0 // ... 07/12 01:57
LPH66: 他就是要 Result0 編譯錯誤...不過倒是可以 #else #error 07/12 04:31
loveflames: if/else的寫法,如果合法值要改就得改header 07/12 09:21