gpt4 book ai didi

c - 生成结构定义的版本 ID?

转载 作者:太空狗 更新时间:2023-10-29 15:04:35 25 4
gpt4 key购买 nike

基本上,我想要的是某种编译时生成的版本,它与结构的确切定义相关联。如果结构的定义以任何方式发生变化(字段添加、移动、可能 重命名),我希望该版本也发生变化。

这样的版本常量在读取先前序列化的结构时会很有用,以确保它仍然兼容。另一种方法是手动跟踪手动指定的常量,如果忘记递增它(反序列化会产生垃圾),这可能会造成困惑的影响,并且还会提出确切何时递增它的问题(在开发和测试期间,或仅在某种类型的过程中)发布)。

这可以通过使用外部工具在结构定义上生成散列来实现,但我想知道 C 编译器(和/或其预处理器)本身是否可行。

这实际上是某种形式的内省(introspection),所以我怀疑这在 ANSI C 中可能根本不可能,但我很乐意使用 gcc 和 clang 的解决方案。

最佳答案

Windows API 过去(现在仍然如此?)有一个 size 成员作为结构的第一个成员之一,因此它知道它被传递的结构的版本(参见 WNDCLASSEX 作为示例):

struct Foo
{
size_t size;
char *bar;
char *baz;
/* Other fields */
};

在调用之前使用 sizeof 设置大小:

struct Foo f;

f.size = sizeof(struct Foo);
f.bar = strdup("hi");
f.baz = strdup("there");

somefunc(&f);

然后 somefunc 会根据 size 成员知道它正在处理的结构的哪个版本。因为 sizeof 是在编译时而不是运行时计算的,所以这允许向后 ABI 兼容性。

关于c - 生成结构定义的版本 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11235146/

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