質問: cmakeで下記のように設定するコードを多く見受けられますが、何をしているのか教えて頂けますでしょうか。 **例:** ``` set(CMAKE_CXX_FLAGS "-std=c++14") ``` c++14とc++17の違いがよくわかりません。gccのバージョンと関連がある? gccのバージョンは7.5なので、14とか17だと全然違ったバージョンになっている? 基本すぎるのか、ググっても解説しているサイトが無かったので、教えて頂けますでしょうか。 また、指定しなかった場合はどんな問題があるのかも教えて頂けますでしょうか。
回答: [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") 言語にも言語仕様ってのがあります。しかも改版されています。そのため、改版が行われた年を用いて C++98 とか C++11 とか呼びならわしています。たいていのユーザーは自分の使い慣れた(規格)バージョンのコンパイラを使い続けたがったり、コンパイラメーカーも最新規格に追従しきれなかったりエンバグを恐れて追従しなかったりで、要するに世間には異なる「仕様バージョン」のコンパイラが氾濫しています。 # コンパイラのバージョンとは全く異なることには厳に注意 ``` $ gcc --help --verbose # あるいは $ g++ --help --verbose ``` と入力すると gcc のコマンドオプションの詳細が表示されます(膨大なのでリダイレクトしてファイルに保存することを推奨)これによると [cygwin](/questions/tagged/cygwin "'cygwin' のタグが付いた質問を表示") の gcc-10.2.0 は `-std=c++03` (ISO/IEC 14882:2003 仕様を採用) `-std=c++11` (同 2011) `-std=c++14` (同 2014) `-std=c++17` (同 2017) `-std=c++20` (同 2020 ドラフト) `-std=c++98` (同 1998 だが 2003 と同じ動作をする) に対応しているとのこと (GNU 拡張を有効にするときは `-std=gnu++11` 等にする) それぞれにてどのような拡張・変更があったかは > > 指定しなかった場合はどんな問題がある > > > まあ単純に [c++14](/questions/tagged/c%2b%2b14 "'c++14' のタグが付いた質問を表示") にはまだなくて [c++17](/questions/tagged/c%2b%2b17 "'c++17' のタグが付いた質問を表示") 以後で使えるようになった機能がもしソースコード上実際に使われていれば、コンパイルエラーになります。 基本的には改定後規格は改定前規格より拡張されているので、新バージョンを指定しておけばほぼ問題ないはずなんですが、当然ながら 2011 年にリリースされているコンパイラはほぼ確実に c++11 には対応していないので、手持ちコンパイラのバージョンと相談になります。 c](/questions/tagged/c "'c' のタグが付いた質問を表示") の場合は [「自動変数の配列は初期化できません」の意味が分かりません 参照