[問題] 於編譯期檢查結構體大小, 若違反停止編譯

看板C_and_CPP作者時間11年前 (2014/08/27 22:52), 11年前編輯推噓3(301)
留言4則, 3人參與, 最新討論串1/1
[問題] 於編譯期檢查結構體大小, 若違反停止編譯 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

08/27 22:59, , 1F
常見的 Static assertions 做法 http://goo.gl/anSa2g
08/27 22:59, 1F

08/27 22:59, , 2F
在沒有 static_assert 之前常常這麼做
08/27 22:59, 2F
通常為了節省檔案空間 有的時候會這樣做 (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

08/28 00:19, , 3F
#1IrElygp 這邊有modern c++ design的做法 要修改一下
08/28 00:19, 3F

08/28 00:20, , 4F
主要就是把原來的0改成負值即可
08/28 00:20, 4F
文章代碼(AID): #1J_V2Iq6 (C_and_CPP)