質問
次のコードがあった場合:
for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
int var2 = 16;
}
それから、その後、私は次のことを書きました:
myvar = 0;
var2 = 0;
それは合法でしょうか?私のVC ++ 6はそれを正しくコンパイルしますが、これは違法であるべきだと思います。 (他のコンパイラの1人にコンパイラエラーが発生します。)
解決
VC6はかなり古く、常に...剛性があるわけではありません...標準の適用において:-)それは実際に 漏れた 次のような特定の状況での範囲:
for (int i = 0; i < 10; i++) { }
// You can still use 'i' here.
これはいくつかにつながりました ファンキーマクロマジック この問題を回避するために。 ISO Conformantコンパイラを使用している場合、あなたがやろうとしていることの両方は違法です。
ISO C ++ 11から 3.3.3/1
, 、ブロックスコープの導入に対処します {...}
:
ブロックで宣言された名前は、そのブロックにローカルです。ブロックスコープがあります。その潜在的な範囲は、宣言の時点で始まり、ブロックの最後で終わります。
セクション 6.5.3
「作成された」変数の範囲をカバーします for
声明:
場合
for-init-statement
宣言であり、宣言された名前の範囲は、for-statement
.
他のヒント
いいえ、それはそうではありません(§3.3.2ローカルスコープ):
- ブロック(6.3)で宣言された名前は、そのブロックのローカルです。その潜在的な範囲は、宣言の時点(3.3.1)で始まり、宣言領域の終わりで終わります。
過去10年間にリリースされたコンパイラを使用することをお勧めします。
それは違法であるはずですが、VC6はそれで非常に悪かったです。
Visual Studio 2005では、新しいプロジェクトレベルの設定が導入されました。 「ループスコープにおける力の適合」. 。これは問題に対処し、後方互換性も提供しました。つまり、古いコードベースは、この設定を無効にすることにより、Visual Studioの新しいバージョンでコンパイルできることを意味します。
ただし、MSがVS2005でこれを正しく行ってデフォルトでこれをオンにしたことの1つは、標準に少し近づいています。
それは合法でしょうか?私のVC ++ 6はそれを正しくコンパイルしますが、これは違法であるべきだと思います。
いいえ、合法ではありません。 DUMP VC ++ 6。新しいより良いコンパイラを使用します。
VCは、ループと条件付きステートメントで宣言された変数に適切な範囲を実装するのに約10年かかりました。通常、C ++に関するVC6 '判断に頼ることはできません。