【问题标题】:C macro to ensure element is at start of struct确保元素位于结构开头的 C 宏
【发布时间】: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

我在想你可以使用 OFFSETOFBUILD_BUG_ON_ZERO 宏的组合,但这需要在初始化时知道​​结构布局,并且由于变量未声明而产生错误。

这在 C 中可能吗?

【问题讨论】:

  • 如果你想把它放在开头那为什么不把它放在开头呢?
  • @sean 我想用同一个指针引用第一个元素和包含它的结构(一个便宜的'n讨厌的单一继承实现),所以如果任何结构被单个字符关闭整个事情都会崩溃 - 我想要一个编译时保证它在正确的位置。只是好奇能不能实现
  • 您可能想了解offsetof。虽然会出现问题,因为当您使用START 宏时,类型别名b 将不存在,并且结构未完全定义,因此使用offsetof 宏可能不可靠。
  • offsetof 必须是 C 中的编译时常量,因此您只需执行编译时断言 offsetof(struct foo, a) == 0

标签: c macros struct


【解决方案1】:

在您实际采用该布局的位置使用compile time assertion,而不是在定义站点。当然,您需要在开始时实际定义它才能通过断言。

【讨论】:

  • 我必须将它构建到构造函数宏中,但这似乎是唯一的方法
【解决方案2】:

也许这样的东西对你有用:

#define typedef_header(x) typedef struct { x

typedef_header(int a);
  int c;
} b;

int main()
{
  b x;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多