C++ 11 を使用しないクロス プラットフォーム (Win と Mac) の製品コード ベースがあるとします。
Mac のコンパイラ オプションが C++11 言語の方言を使用するように変更されたが、C++11 標準ライブラリが使用されていないとします。
考えられる影響を理解するためにグーグルで調べてみましたが、空っぽになっています。
私の質問は次のとおりです。
- clang で言語の方言を変更するとはどういう意味ですか?
- このようなことをすることのリスクは何ですか?
C++ 11 を使用しないクロス プラットフォーム (Win と Mac) の製品コード ベースがあるとします。
Mac のコンパイラ オプションが C++11 言語の方言を使用するように変更されたが、C++11 標準ライブラリが使用されていないとします。
考えられる影響を理解するためにグーグルで調べてみましたが、空っぽになっています。
私の質問は次のとおりです。
私は XCode を使用していませんが、clang 用に (おそらく不完全だが到達している) C++11 モードを出荷している場合、(おそらく不完全だが到達している) C++11 標準も出荷していると思います。図書館。そして、それらを一緒にテストします。したがって、あなたの状況は発生しないはずですが、とにかく発生すると仮定します:
標準では、「言語」と「ライブラリ」を混合して一致させる方法を認識していないため、形式的には何の意味もありません。それが何を意味すると考えるかは、コンパイラ次第です。おそらく、右辺値参照、ラムダなどの新しい「言語機能」が利用可能になることを意味しますが、名前空間の新しいクラスと関数は利用できstd
ません。
主なリスクは、おそらく、認識されている標準に合わせてプログラミングしていないことです。コンパイラによって発明された、文書化されていない可能性のあるものにプログラミングしています。コンパイラが C++11 モードでは C++11 標準ライブラリが必要であると言い、C++03 標準ライブラリを提供すると、コンパイラのドキュメントを責める必要さえありません。起こって、あなたはそれを壊しました、あなたのせいです。
このおかしな組み合わせのリスクとは別に、C++03 コード ベースを使用してC++11 コンパイラを使用してコンパイルすることには、小さなリスクがあります。C++03 には、C++11 としてコンパイルされますが、意味が微妙に (または大きく) 異なるコード構造がいくつかあります。
たとえば、C++11 では正しく動作しないムーブ コンストラクターが生成されるため、C++11 で使用すると壊れるクラスを C++03 で作成することはほぼ可能です。正しいことを行わないコンパイラ生成のコピー コンストラクターを置き換える必要がある場合があります (3 つのルール)。C++11 では、これらの「通常の」状況ではムーブ コンストラクターが抑制されることが保証されますが、いくつかの奇妙なエッジがあります。ケース。残念ながら、現時点ではそれらを思い出せません。
C++11 標準には、C++11 と C++03 の間のいくつかの非互換性がリストされています。あなたはすべてを望んでいますが、それがどのようであるかを知っています. リストは付録 C にあります。
この国際標準では、有効な C++ 2003 コードがコンパイルに失敗したり、異なる結果を生成したりする可能性があります。具体的には、 、 、 、 、 、 または という名前のマクロは、文字 列
R
リテラルに隣接しても展開されませんが、文字列リテラルの一部として解釈されます。u8
u8R
u
uR
U
UR
LR
そして、そこから読んでもそれほど魅力的ではありません。ただし、これは基本的に、C++03 コード ベースに表示される場合、同等の C++11 を取得するために変更する必要があるもののリストです。
実際には「リスク」はありませんが、C++11 の価値の多くはライブラリから得られます。
言語を C++11 に変更すると、C++11 言語機能がサポートされます。標準を見てみると、言語 (条項 1 ~ 16) とライブラリ (条項 17 ~ 30) の機能に分かれていることがわかります。言語機能は、文法、式とステートメントの意味、オーバーロードの解決などをカバーします。ライブラリ機能は、標準ヘッダーの内容をカバーします。したがって、C++11 で何かを行うために特定のヘッダーが必要な場合は、おそらく C++11 標準ライブラリが必要です。
Xcode は、gcc 4.2 に同梱され、C++03 用にビルドされた libstdc++ のバージョンをサポートしています。これは、clang が C++11 モードに設定されている場合に正常に機能します。また、C++03 コンパイラでも多くの C++11 機能を提供するように設計された libc++ もサポートしています。したがって、ミキシングとマッチングはほとんどの場合うまく機能するはずです。ただし、相互に設計された言語とライブラリを一緒に使用することで、より多くの価値が得られます。
GCCとclangは、c++のコンパイルが少し異なります。これはあなたの場合には違いがないかもしれませんが、他の誰かの場合には違いがあるかもしれないので、GNUスタイルのコンパイルに戻すことができます。したがって、「言語方言」。
言語とstdlibをGNUバージョンに設定している限り、違いはありません。ただし、GNUダイアレクトでApple LLVMコンパイラ(clang)を使用してコンパイルすると、Windowsと同じ結果が得られない場合があります(両方でGCCを使用している場合)。特にサードパーティのライブラリが登場し、C ++11をサポートするためにlibstdc++をlibc++と交換する場合は特に、両方のプラットフォームで一致するライブラリ、コンパイラ、および設定を使用しない限り、常にある程度のリスクがあると思います。
WindowsでVC++を使用する場合、C ++ 11のサポートはかなり不足しているため、XCodeコードがVC++でのビルドを拒否しても驚かないでください。
多くの C++11 言語機能がライブラリ機能に支えられていることを忘れないでください。たとえば、 and なしstd::move
では右辺値参照はあまり使用されずstd::forward
、初期化子リストもジャンクになります。