假设C库必须与应用程序代码共享结构的细节,并且必须保持API和ABI向后兼容性.它试图通过检查传递给它的结构的大小来做到这一点.
比如说,需要更新以下结构.在库版本1中,
typedef struct {
int size;
char* x;
int y;
} foo;
Run Code Online (Sandbox Code Playgroud)
在库的第2版中,它更新为:
typedef struct {
int size;
char* x;
int y;
int z;
} foo_2;
Run Code Online (Sandbox Code Playgroud)
现在,库版本2想要检查应用程序是将新的foo_2还是旧的foo作为参数arg传递给函数.它假定应用程序已设置arg.size为sizeof(foo)或sizeof(foo_2)尝试确定应用程序代码是否为版本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.
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么这不会失败.在GCC 4.6.3,与-O3标志,无论是sizeof(foo)和sizeof(foo_2) …