[問題] 確保#define的值在編譯時正確
開發平台(Platform): (Ex: Win10, Linux, ...)
Embedded System
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
由於Code size,無法額外使用函式庫
問題(Question):
我的程式有個用#define定義的數值,譬如
#define FOO_VALUE 5
我已經知道,這個值一定會是5,11,18,21,29之一(沒什麼規律的串列)
希望如果使用這段Code的人填了錯誤的值的時候
可以在Compile的時候就抓到錯誤,不要到runtime的時候才檢查
#define FOO_VALUE 10
可以編譯的時候跑出錯誤
目前試過以下這樣的寫法可以達到我的目標
#if FOO_VALUE == 5
#elif FOO_VALUE == 11
#elif FOO_VALUE == 18
#elif FOO_VALUE == 21
#elif FOO_VALUE == 29
#else
#error "INVALID FOO_VALUE"
#endif
但寫起來很醜又累贅…
會需要用同樣的方式再去檢查BAR_VALUE, ABC_VALUE...等等
這樣一堆寫起來還挺可怕的orz
想請問要達成一樣的事,還有沒有其他的寫法呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.79.109
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1499741476.A.25B.html
→
07/11 18:11, , 1F
07/11 18:11, 1F
→
07/11 18:11, , 2F
07/11 18:11, 2F
有道理orz
推
07/11 19:14, , 3F
07/11 19:14, 3F
→
07/11 20:44, , 4F
07/11 20:44, 4F
→
07/11 20:44, , 5F
07/11 20:44, 5F
推
07/11 20:45, , 6F
07/11 20:45, 6F
→
07/11 20:45, , 7F
07/11 20:45, 7F
metaprogramming要寫到可讀性高好像是不可能的任務Q_Q
→
07/11 20:46, , 8F
07/11 20:46, 8F
推
07/11 20:50, , 9F
07/11 20:50, 9F
推
07/11 20:52, , 10F
07/11 20:52, 10F
假如可以用static_assert的話,要怎麼寫會比較簡潔呢?(單純好奇)
→
07/11 21:44, , 11F
07/11 21:44, 11F
→
07/11 21:45, , 12F
07/11 21:45, 12F
→
07/11 21:46, , 13F
07/11 21:46, 13F
→
07/12 00:02, , 14F
07/12 00:02, 14F
我用的是針對Andes架構修改的gcc,不確定有支援標準到什麼程度
剛剛測試了一下,_Static_assert可以使用
→
07/12 11:58, , 15F
07/12 11:58, 15F
以我原本舉的例子來說
如果我希望FOO_VALUE是5,11,18,21,29之一之一
static_assert要怎麼寫會比較簡潔呢?
※ 編輯: james732 (223.136.79.109), 07/12/2017 12:27:50
→
07/12 13:30, , 16F
07/12 13:30, 16F
→
07/12 13:30, , 17F
07/12 13:30, 17F
推
07/13 10:46, , 18F
07/13 10:46, 18F
→
07/13 11:00, , 19F
07/13 11:00, 19F
→
07/13 11:15, , 20F
07/13 11:15, 20F
→
07/13 22:37, , 21F
07/13 22:37, 21F
→
07/13 22:37, , 22F
07/13 22:37, 22F
→
07/13 22:37, , 23F
07/13 22:37, 23F
→
07/13 22:39, , 24F
07/13 22:39, 24F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 4 篇):