[問題] 於編譯期檢查結構體大小, 若違反停止編譯
[問題] 於編譯期檢查結構體大小, 若違反停止編譯
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
08/27 22:59, 1F
推
08/27 22:59, , 2F
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
08/28 00:19, 3F
→
08/28 00:20, , 4F
08/28 00:20, 4F