c - 如何在预处理器宏中使用 "sizeof"?

标签 c gcc

有什么方法可以在预处理器宏中使用 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/

相关文章:

c - 有界缓冲区程序引入数据竞争 : Where are they? 如何修复它们?

c - 实现一个函数以递归方式返回有效的获胜条件 - C

c++ - 如何忽略 'comparison between signed and unsigned integer expressions' ?

与不同 C++ 标准链接的 C++ std 库

c - 字符串在 Visual Studio 和 gcc 中的打印方式不同

c++ - 主要开源项目使用哪些 GCcflags来控制 C 和 C++ 中的未定义行为?

iphone - 使用 LLVM 构建和任何优化都会导致应用程序在启动时崩溃

冲突的返回类型

c - C语言中指针交换时使用整数声明而不是指针整数

c - 二进制 + 的无效操作数(具有 'float*' 和“float*”)