以下の(非常に単純な)コードがあるとします。
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
これは、g ++とclangの両方で正常にコンパイルされます。ただし、次のエラーによりMSVCでコンパイルできません。
エラーC2039: 'stoi':は 'std'のメンバーではありません
エラーC3861: 'stoi':識別子が見つかりません
私はそれstd::stoiが<string>ヘッダーの一部であることを知っています。おそらく前者の2つのコンパイラーはその一部としてインクルードし<iostream>、後者はインクルードしません。C ++標準[res.on.headers]に準拠
C ++ヘッダーには、他のC ++ヘッダーが含まれている場合があります。
私にとって、これは基本的に3つのコンパイラすべてが正しいと言います。
この問題は、TAがコンパイルしていないとマークした私の生徒の1人が提出したときに発生しました。もちろん行って修正しました。しかし、私はこのような今後の事件を防ぎたいと思います。では、3つの異なるコンパイラーでコンパイルして毎回チェックするのではなく、どのヘッダーファイルをインクルードするかを決定する方法はありますか?
私が考えることができる唯一の方法は、すべてのstd関数呼び出しに対して適切なインクルードが存在することを確認することです。しかし、何千行もある既存のコードがある場合、これを検索するのは面倒な場合があります。クロスコンパイラの互換性を確保するためのより簡単な/より良い方法はありますか?
3つのコンパイラの例:https : //godbolt.org/z/kJhS6U
std::stoi、すぐに#include <string>存在することも確認します。
std::stoiを処理するためのものであることを覚えている場合は、それを含めるのに適したヘッダーであると推測できます。または、あなたに教えてくれる良いリファレンスを検索することもできます。また、常に明示的にヘッダーファイルを含めることをお勧めします。これにより、移植性のない実装固有の動作に依存する必要がなくなります。<string>