首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保字段只添加到结构的末尾?

确保字段只添加到结构的末尾?
EN

Stack Overflow用户
提问于 2010-06-25 20:42:06
回答 6查看 289关注 0票数 2

我有一个很奇怪的问题:我需要维护一段涉及结构的代码。这些结构需要通过不时向它们添加字段来进行修改。添加到结构的末尾是您应该做的事情,而且每当您将字段添加到结构的中间时,您都会以一种非平凡的方式破坏代码。

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

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

代码语言:javascript
复制
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++模板元程序技巧或其他方法有任何建议,这会使这更容易呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-25 20:57:11

您可能应该使用一种结构继承的形式(c -style)来使每个人都更容易理解。

基本上,您不希望修改的结构

代码语言:javascript
复制
//DO not modify this structure!!!
struct Foo
{
   int *Bar;
   int Baz;
};

和一个FooExtensions (或其他什么)结构,人们可以修改willy-nilly。

代码语言:javascript
复制
struct FooExtensions
{
   struct Foo base;
   //go crazy but keep base as the first thing.
};

然后,要将FooExtnesions对象传递给期望Foo的方法,只需将其强制转换为Foo,则成员对齐将得到解决方案。这是维护这种向后兼容性的一种更常见的模式。显然,人们仍然可以无视这一惯例,但这会使成功变得容易一些。

您仍然可以添加所有的static_asserts以确保Foo没有被修改

票数 4
EN

Stack Overflow用户

发布于 2010-06-25 21:00:14

如果解释代码中的情况的注释不会这样做,那么您的代码中也不会声明或任何其他内容。这就是将要发生的事情:

程序员将字段添加到struct的中间

程序员从断言(或其他聪明的方法)获得编译错误

程序员更改断言(或其他聪明的方法),以便在中间使用加法进行编译。

:-)

我最喜欢的是,当人们“改进”精心设计的对象时,只需将私人成员公之于众,然后随意写信给他们。

一个更好的想法是,在源代码管理中实现规则,以防止正常更改的代码的提交。您必须编写一个程序,在登录时运行并保存结构,然后在下一次比较它们以查看它们是如何变化的,然后让源代码管理运行它--您可以知道它是否有效。也许就像fxcop为.net所做的那样(是吗?)

简单得多--只需要包含结构的源,在签入之前让您检查它们(取消它们在您的批准中检查它们的权限;取决于您的源代码控制)。

票数 3
EN

Stack Overflow用户

发布于 2010-06-25 20:52:17

添加评论

代码语言:javascript
复制
// New field must be added at the end of the struct
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3121308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档