私はこの質問に対してさまざまな検索用語を試し続けていますが、Googleとstackoverflowの両方でノイズを見つけています。C ++の標準ライブラリ(std)を使用してコードを記述した場合、基本的にすべてがWindows、Mac、およびLinux用にコンパイルされることが保証されていますか(意図したとおりに動作することを願っています)?
3 に答える
この標準は、C ++コンパイラであることの意味を定義しており、C++であると主張するすべてのコンパイラは標準に準拠している必要があります。そうでないものはバグがあると見なすことができます。主要なコンパイラはすべて、準拠するように最善を尽くしています。
ここで関係する複数の標準があります-C++98、C ++ 03、C ++ 11、C ++ 14、C ++ 17、そして作業はC++20で開始されました。最新の現在の標準の機能がすべてのコンパイラに実装されていない場合があります。C ++ 03に固執する場合は、幅広い適合性を見つける必要があります。
std
定義上、名前空間内のすべてが標準の一部である必要があります。
コードは、すべての標準準拠のコンパイラ/プラットフォーム間で互換性があることが保証されていますが、ABIはそうではないことに注意することが重要です。つまり、異なるコンパイラ/バージョン/プラットフォームから作成されたバイナリ間でリンクすることが安全であるとは限りません。
実際には、これは、まったく同じ方法でまったく同時に両方をコンパイルしない限り、あるライブラリ間でstring
STLオブジェクトを渡さないことを意味します。vector
これは、動的データにポインターを渡すときに特に重要ですshared_ptr
。前述の保証を満たさない限り、ライブラリAPIで使用することはできません。代わりに、通常のポインターを使用する必要があります。
議論は、STLに準拠していないものはすべてC ++に準拠していないということです。したがって、ある意味では、すべてのSTLはクロスプラットフォームです。
ただし、STLの一部は実装定義が許可されていることに注意してください。たとえば、type_info::nameを参照してください