2016-08-01 4 views
2

CおよびC++の標準では、データ型の正確な長さは指定されておらず、最小長のみが指定されています。サードパーティのライブラリで異なるデータ型の長さ

私はサードパーティ製のライブラリsomeLib.lib(私のプラットフォーム用にコンパイル済み)とそれに対応するsomeLib.hを持っています。限り、私はint Sを使用して、すべてが正常にコンパイルする必要があり、

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

私はこのライブラリを消費するプログラムをコンパイル、コンパイラはsomeLib.hで定義された署名付きのタイプをチェックします:それは、以下の機能が含まれているとしましょう。

しかし、私のコンパイラのintが、使用されたコンパイラの長さよりも長くても短くなっても、何が起こるのですか?someLib.lib?リンク時に検出されますか?ランタイムエラーの原因になりますか?コンパイル方法を知らなくても、someLib.libを安全に使用できますか?

+0

これは、 'int'のような単純な型ではほとんど問題ではありません。この種の問題が現れるのは、コンパイラの違いや同じコンパイラ上の異なるオプションによって異なるパディングを持つ構造体です。またはビットフィールドなどの実装定義の詳細を持つフィーチャを使用します。これは、そのような詳細を完全にライブラリ内に含む不透明なインタフェースを持つ1つの理由です。 –

答えて

3

コンパイラエラーまたはリンカエラーは発生しないでください。実行時には未定義の動作のみが発生します。おそらくクラッシュしたり、運が良ければ奇妙な結果になります。

+3

奇妙な結果しか得られないなら、あなたがクラッシュして不運になるならあなたはラッキーだと言いたい。 – Jovasa

1

基礎となるシステムまたはコンパイラに関する狭い仮定を持つライブラリを使用すると、問題が発生する可能性があります。

したがって、使用しているライブラリがintが16ビットだと仮定していても、32ビットシステムで使用している場合は、実行時に問題が発生します。

これらの問題を最小限に抑えるために、実装されたライブラリには#ifというマクロがあります。あるいは、さまざまなシステムにさまざまなファイルを実装しています(.lib)。彼らは、移植性を高めるために、intX_t(例えば、int32_t)の整数を明示的に使用することさえできる。

関連する問題