【发布时间】:2014-07-02 15:01:57
【问题描述】:
有没有一种方法可以设计一个宏来确保元素在定义期间位于结构的开头?例如:
typedef struct {
START(int a);
} b;
// Becomes
typedef struct {
int a;
} b;
但是当它不是第一个元素时会产生编译时错误?
typedef struct {
int c;
START(int a);
} b;
// Generate an error
我在想你可以使用 OFFSETOF 和 BUILD_BUG_ON_ZERO 宏的组合,但这需要在初始化时知道结构布局,并且由于变量未声明而产生错误。
这在 C 中可能吗?
【问题讨论】:
-
如果你想把它放在开头那为什么不把它放在开头呢?
-
@sean 我想用同一个指针引用第一个元素和包含它的结构(一个便宜的'n讨厌的单一继承实现),所以如果任何结构被单个字符关闭整个事情都会崩溃 - 我想要一个编译时保证它在正确的位置。只是好奇能不能实现
-
您可能想了解
offsetof。虽然会出现问题,因为当您使用START宏时,类型别名b将不存在,并且结构未完全定义,因此使用offsetof宏可能不可靠。 -
offsetof必须是 C 中的编译时常量,因此您只需执行编译时断言offsetof(struct foo, a) == 0。