質問

次のコードがあった場合:

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ローカルスコープ):

  1. ブロック(6.3)で宣言された名前は、そのブロックのローカルです。その潜在的な範囲は、宣言の時点(3.3.1)で始まり、宣言領域の終わりで終わります。

過去10年間にリリースされたコンパイラを使用することをお勧めします。

それは違法であるはずですが、VC6はそれで非常に悪かったです。

Visual Studio 2005では、新しいプロジェクトレベルの設定が導入されました。 「ループスコープにおける力の適合」. 。これは問題に対処し、後方互換性も提供しました。つまり、古いコードベースは、この設定を無効にすることにより、Visual Studioの新しいバージョンでコンパイルできることを意味します。

ただし、MSがVS2005でこれを正しく行ってデフォルトでこれをオンにしたことの1つは、標準に少し近づいています。

それは合法でしょうか?私のVC ++ 6はそれを正しくコンパイルしますが、これは違法であるべきだと思います。

いいえ、合法ではありません。 DUMP VC ++ 6。新しいより良いコンパイラを使用します。

VCは、ループと条件付きステートメントで宣言された変数に適切な範囲を実装するのに約10年かかりました。通常、C ++に関するVC6 '判断に頼ることはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top