假設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