有什么方法可以在预处理器宏中使用 sizeof
吗?
例如,多年来我想做的事情有很多:
#if sizeof(someThing) != PAGE_SIZE
#error Data structure doesn't match page size
#endif
我在这里检查的确切内容完全是编造的 - 关键是,我经常喜欢放入这些类型的(大小或对齐)编译时检查以防止有人修改可能错位的数据结构或调整会破坏它们的东西的大小。
不用说 - 我似乎无法以上述方式使用 sizeof
。
最佳答案
有几种方法可以做到这一点。
如果 sizeof(someThing)
,以下片段将不会产生任何代码等于 PAGE_SIZE
;否则它们会产生编译时错误。
1。 C11方式
从 C11 开始,您可以使用 static_assert
(需要 #include <assert.h>
)。
用法:
static_assert(sizeof(someThing) == PAGE_SIZE, "Data structure doesn't match page size");
2。自定义宏
如果你只是想在 sizeof(something)
时得到一个编译时错误不是你所期望的,你可以使用下面的宏:
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
用法:
BUILD_BUG_ON( sizeof(someThing) != PAGE_SIZE );
This article详细解释它为什么有效。
3。特定于 MS
在 Microsoft C++ 编译器上,您可以使用 C_ASSERT宏(需要 #include <windows.h>
),它使用类似于第 2 节中描述的技巧。
用法:
C_ASSERT(sizeof(someThing) == PAGE_SIZE);
关于c - 如何在预处理器宏中使用 "sizeof"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4079243/