2016-08-01 54 views
2

C和C++標準都沒有指定某些數據類型的確切長度,只是它們的最小長度。第三方庫中的不同數據類型長度

我有第三方庫:someLib.lib(爲我的平臺編譯)及其相應的someLib.h。比方說,它包含以下功能:

int getNumber(); 
void setNumber(int number); 

當我編譯程序消耗這個庫,編譯器檢查與在someLib.h定義簽名的類型,所以只要我使用int S,一切都應該編譯罰款。

但是,在我的編譯器的int中比在編譯器someLib.lib中使用的編譯器長或短時發生了什麼?在鏈接過程中會被檢測到嗎?它會導致運行時錯誤?如果不知道它是如何編譯的,我可以安全地使用someLib.lib嗎?

+0

這對於簡單類型(例如int)幾乎不存在問題。這種問題出現的地方在於具有不同填充的結構,這取決於編譯器的差異,甚至是同一編譯器上的不同選項;或者具有實現定義的細節(如位域)的功能。這就是擁有完全在庫中包含這些細節的不透明接口的原因之一。 –

回答

3

你不應該得到編譯器或鏈接器錯誤,在運行時只有未定義的行爲。可能會崩潰,或者如果你幸運的話,結果會很奇怪。

+3

如果你碰到碰撞和不幸,如果你得到奇怪的結果,我會說你是幸運的。 – Jovasa

1

使用一個對底層系統或編譯器有較窄假設的庫會導致問題。

因此,如果您使用的庫假定int是16位,但是您在32位系統中使用它,則在運行時會遇到問題。

良好實現的庫具有#if宏以儘量減少這些問題,或者他們已經爲不同的系統實現了各種.lib文件。他們甚至可以明確地使用intX_t(例如int32_t)整數來更便攜。