结构更改的编译时提示/警告



我有一个带有一些字段的基本POD结构

struct A{
int a,
int b,
};

我的用例的性质要求这些字段每隔一段时间就会发生变化(比如1-2个月,有规律但不经常(。这意味着我想在更改后检查结构的字段用法,以确保一切正常。

编译器检查所有字段的使用是否有效,类似a.c的操作将在编译时失败。

然而,我的一些函数应该访问并处理A的所有字段。因此,当编译器验证所有用法是否有效时,它并不能验证是否使用了所有字段。

这项工作/检查必须手动完成(如果在编译时有办法做到这一点,请启发我(。因此,我们目前的设计试图让这一切尽可能简单。我们将大多数相关函数分组到一个文件夹/库中,以便在一个地方检查它们。然而,有些用法嵌入了私有类函数中,老实说,重构到公共库中比它带来的好处更痛苦。

仅仅依靠文件说明";嘿,在更改结构体A之后,检查类FooThing"中的函数foo;。但我想看看我们是否能得到某种类型的编译时警告。

我的想法基本上是在每个相关的函数下删除一个static_assert,以检查a的大小。大多数更改都应该更改大小,所以一个未更改的static_assert在编译时会失败,这让我看到了函数的一般区域。然后我可以更改函数和断言。

因此,除了函数foo,例如,我还有类似static_assert(sizeof(A) == 16)或任何大小的函数。这并不是万无一失的,因为对结构的更改可能不会改变总大小,但我在这里并不是在寻找真正严格的东西,只是在90%的时间里都有帮助的东西。

这对我来说不起作用的主要原因是int和其他数据类型没有标准中指定的大小。这对我来说是个问题,因为我的项目是跨平台的。

简而言之,我正在寻找一种方法,在结构的定义更改后,在编译时发出信号来检查某些函数。

一种可能性是将版本号放入结构本身,如下所示:

struct A{
int a;
int b;
static constexpr int major_version = 1;
};

然后,在调用代码时,放置断言来检查主要版本的值:

void doSomething(A a)
{
static_assert(A::major_version == 1, "Unexpected A major version");
// Do something with a
}

然后,每当你对A进行更新,认为值得重新检查所有调用代码时,你就增加A::major_version,然后static_assert就会在你没有更改的地方触发。

最新更新