[英]Type punning two types from different third party libraries without union
[英]Different data type lengths in third party libraries
C和C ++標准都沒有指定某些數據類型的確切長度,而僅指定了它們的最小長度。
我有一個第三方庫: someLib.lib
(針對我的平台編譯)及其對應的someLib.h
。 假設它包含以下功能:
int getNumber();
void setNumber(int number);
當我編譯使用該庫的程序時,編譯器會使用someLib.h
定義的簽名檢查類型,因此,只要我使用int
,一切都可以正常編譯。
但是,如果在我的編譯器的int
中使用的someLib.lib
長於或短於使用compile someLib.lib
的編譯器,會someLib.lib
什么? 鏈接期間會檢測到嗎? 會導致運行時錯誤嗎? 我可以在不知道如何編譯的情況下安全地使用someLib.lib
嗎?
您不應獲得編譯器或鏈接器錯誤,而應僅獲得運行時未定義的行為。 可能會崩潰,或者如果您很幸運,則結果很奇怪。
使用對底層系統或編譯器的假設狹窄的庫可能會導致問題。
因此,如果您使用的庫假定int
為16位,但您在32位系統中使用它,則運行時會遇到問題。
實施良好的庫具有#if
宏以最大程度地減少這些問題,或者它們已為不同的系統實現了各種.lib
文件。 他們甚至可以顯式地使用intX_t
(例如int32_t
)整數,以便於移植。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.