gpt4 book ai didi

c++ - 确保字段只添加到结构的末尾?

转载 作者:太空狗 更新时间:2023-10-29 23:47:58 26 4
gpt4 key购买 nike

我有一个相当奇怪的问题:我需要维护一段涉及结构的代码。这些结构需要不时地通过向它们添加字段来修改。添加到结构的末尾是你应该做的,任何时候你将一个字段添加到结构的中间,你已经破坏了代码一种重要的方式。

这已成为维护的噩梦,因为这些确实需要偶尔修改,并且摆脱修改这些结构(以及由于先前字段的布局更改而导致它们中断)的唯一方法是完全重写大量代码,这是不可能的。

我需要做的是找到一种方法,使更改结构的布局成为编译错误。现在,我可以这样解决问题:

struct Foo
{
int *Bar;
int Baz;
};

#ifdef _x86_
static_assert(_offsetof(Foo, Bar) == 0);
static_assert(_offsetof(Foo, Baz) == 4);
#else
static_assert(_offsetof(Foo, Bar) == 0);
static_assert(_offsetof(Foo, Baz) == 8);
#endif

但是,这是一项巨大的工作量,因为大约有 20 个这样的结构,每个结构有 4-10 个字段。我可能可以通过仅断言最后一个字段的偏移量位于正确的位置来最大程度地减少这种情况,但这仍然需要大量的手动工作。

有没有人对编译器技巧、C++ 模板元程序技巧或其他可以使这更容易的建议有任何建议?

最佳答案

你可能应该使用一种结构继承的形式(c 风格)来让每个人更容易理解

基本上你会有你不想修改的结构

//DO not modify this structure!!!
struct Foo
{
int *Bar;
int Baz;
};

和一个人们可以随意修改的 FooExtensions(或其他)结构

struct FooExtensions
{
struct Foo base;
//go crazy but keep base as the first thing.
};

然后将 FooExtnesions 对象传递给期望 Foo 的方法,只需将其转换为 Foo,成员对齐就可以解决了。这是维护这种向后兼容性的更常见模式。显然,人们仍然可以忽略约定,但这使得成功变得更容易一些。

您仍然可以添加所有 static_assert 以确保 Foo 未被修改

关于c++ - 确保字段只添加到结构的末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3121308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com