StroustrupのC++プログラミング言語:特別版(第3版)では、Stroustrupは、制御ステートメントの条件文での変数の宣言と初期化が許可されているだけでなく、推奨されていると書いています。彼は、変数のスコープを必要なスコープのみに縮小するので、それを奨励すると書いています。だからこのようなもの...
if ((int i = read(socket)) < 0) {
// handle error
}
else if (i > 0) {
// handle input
}
else {
return true;
}
...優れたプログラミングスタイルと実践です。変数は、それが必要とされてスコープ外になるステートメントi
のブロックに対してのみ存在します。if
ただし、プログラミング言語のこの機能は、g ++(バージョン4.3.3 Ubuntu固有のコンパイル)ではサポートされていないようです。これは私にとっては驚くべきことです。おそらく、私はそれをオフにするフラグを使用してg ++を呼び出しているだけです(私が呼び出したフラグは-g
and-Wall
です)。私のバージョンのg++は、これらのフラグを使用してコンパイルすると、次のコンパイルエラーを返します。
socket.cpp:130: error: expected primary-expression before ‘int’
socket.cpp:130: error: expected `)' before ‘int’
さらに調べてみると、これをサポートしていないコンパイラを持っているのは私だけではないようだということがわかりました。そして、この質問には、言語で標準と思われる構文と、それを使用してコンパイルするコンパイラーについて、混乱が生じているようです。
したがって、問題は、どのコンパイラがこの機能をサポートし、コンパイルするためにどのフラグを設定する必要があるかということです。それは特定の基準にあり、他の基準にはないという問題ですか?
また、好奇心から、人々は一般的にこれが良いスタイルであるとStroustrupに同意しますか?それとも、これは言語の作成者が頭の中でアイデアを思いついた状況であり、それは必ずしも言語のコミュニティによってサポートされているわけではありませんか?