C ++コンパイラは互いに互換性がないことを理解しています。ただし、特にCについては、このトピックに関する情報を見つけることができませんでした。私は、C標準にはコンパイラが適切に実装できる余地を残していることを知っています。たとえば、ほとんどの(すべて?)データ型のサイズとアライメントは、最小限の保証のために実装定義で保存されます。したがって、2つのコンパイラー(または同じコンパイラーの2つのバージョン)は、多くの詳細について意見が一致しません。
異なるコンパイラでコンパイルされた2つのオブジェクトファイルが実際に適切にリンクされるという保証はないという考え方で正しいですか?たとえば、ポインタのサイズは、一方のオブジェクトファイルでは32ビット、もう一方のファイルでは64ビットになります。しかし、そうだとすると、なぜCライブラリはプリコンパイルされた形で配布されるのでしょうか?私が使用したのと同じコンパイラー(例えばgcc)を使用する、またはバイナリー互換性を確保するために使用されている事実上の標準を使用するという期待はありますか?そして、C言語オブジェクトファイルとリンクするときに、外国語インターフェイスを備えた他の言語は、物事が適切に整列することをどのように保証しますか?