看板 C_and_CPP 關於我們 聯絡資訊
[問題] 於編譯期檢查結構體大小, 若違反停止編譯 http://www.virtualbox.org/svn/vbox/trunk/src/VBox/Devices/PC/ipxe/src/include/ipxe/efi/Base.h http://goo.gl/wZY49k 我在上面的網址發現一個有趣的解法 #define VERIFY_SIZE_OF(TYPE, Size) \ extern UINT8 _VerifySizeof##TYPE[ \ (sizeof(TYPE) == (Size)) / (sizeof(TYPE) == (Size)) \ ] VERIFY_SIZE_OF (BOOLEAN, 1); 我將其稍微簡化如下: #define VERIFY_CONDITION(condition) \ extern char _VerifyCondition##__LINE__[ \ (condition) / (condition) \ ] VERIFY_CONDITION (sizeof(BOOLEAN) == 1); 各位是否見過更有趣的解法? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.176.173.209 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1409151122.A.D06.html
LiloHuang: 常見的 Static assertions 做法 http://goo.gl/anSa2g 08/27 22:59
CaptainH: 在沒有 static_assert 之前常常這麼做 08/27 22:59
通常為了節省檔案空間 有的時候會這樣做 (MSVC only) http://www.virtualbox.org/svn/vbox/trunk/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/Include/Ia32/ProcessorBind.h http://goo.gl/al9PXI #if _MSC_EXTENSIONS #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany) #else #define GLOBAL_REMOVE_IF_UNREFERENCED #endif #define VERIFY_CONDITION2(condition) \ char _VerifyCondition##__LINE__[ \ (condition) / (condition) \ ] GLOBAL_REMOVE_IF_UNREFERENCED VERIFY_CONDITION2 (sizeof(BOOLEAN) == 1); 但是我還是覺得原始的 extern 是一絕, 既省空間又有相容性 ※ 編輯: chrisdar (180.176.173.209), 08/27/2014 23:27:14
Killercat: #1IrElygp 這邊有modern c++ design的做法 要修改一下 08/28 00:19
Killercat: 主要就是把原來的0改成負值即可 08/28 00:20