假设C库必须与应用程序代码共享结构的细节,并且必须保持API和ABI向后兼容性。它试图通过检查传递给它的结构的大小来做到这一点。sizeof(struct)如何帮助提供ABI兼容性?
说,以下结构需要更新。在库版本1,
typedef struct {
int size;
char* x;
int y;
} foo;
在库的版本2,将其更新为:现在
typedef struct {
int size;
char* x;
int y;
int z;
} foo_2;
,库版本2要检查应用程序是否通过新foo_2
或老foo
作为参数arg
。它假定应用程序已设置arg.size
到sizeof(foo)
或sizeof(foo_2)
,并尝试找出应用程序代码是否groks版本2
if(arg.size == sizeof(foo_2)) {
// The application groks version 2 of the library. So, arg.z is valid.
} else {
// The application uses of version 1 of the library. arg.z is not valid.
}
我不知道为什么这不会失败。在GCC 4.6.3,与-O3标志,既sizeof(foo)
和sizeof(foo_2)
是24.所以,不会V2库中的代码看不懂,如果应用程序正在通过foo
型或foo_2
的结构?如果是,那么这种方法似乎是如何被使用的?
http://blogs.msdn.com/b/oldnewthing/archive/2003/12/12/56061.aspx
按照第一个问题:是否有一个很好的理由为有利于区分版本使用sizeof(struct)
?正如在评论中指出的,为什么不在共享结构中使用明确的version
成员?
你从哪里得到24? – 2014-09-20 10:58:53
这可能不起作用。 'sizeof'是一个编译时的事情,你想检查* runtime *的大小。 – 2014-09-20 11:03:11
@BasileStarynkevitch:嗯,什么?我们知道调用者使用哪个版本的结构,而不是被调用者,因此从这个方向看起来很好。尽管如此,棘手的是,在大多数64位平台上,指针是8字节对齐和大小的,int 4,因此两个结构之间没有尺寸差异。 – Deduplicator 2014-09-20 11:06:34