作者loveflames (咕啾咕啾魔法陣)
看板C_and_CPP
標題Re: [問題] 確保#define的值在編譯時正確
時間Tue Jul 11 16:16:40 2017
#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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1499761003.A.16F.html
※ 編輯: loveflames (118.171.20.220), 07/11/2017 16:22:46
1F:→ Hazukashiine: 底線後面接大寫字母是保留給編譯器實作的 盡量避免 07/11 18:25
2F:→ Hazukashiine: #define Result0 0 // ... 07/12 01:57
3F:推 LPH66: 他就是要 Result0 編譯錯誤...不過倒是可以 #else #error 07/12 04:31
4F:→ loveflames: if/else的寫法,如果合法值要改就得改header 07/12 09:21