3

ifネストされたステートメントの数(300の球場のどこか)に関するVC ++の制限(どのバージョンかはわかりません)について聞いたことがあります。コードの形式は次のとおりです。

if (a) ...
else if (b) ...
else if (c) ...
...

こういうことには限界があり、限界が小さいことに驚きました。私はコーディングの練習についてのコメントや、なぜこの種のことを完全に避けるのかについてのコメントを探していません。

これが私が想像するもののリストですいくつかの制限があるかもしれません:

  • スコープ内の関数の数(グローバル、クラス、または名前空間)。
  • 1つのステートメント内の式の数(例:複合条件)。
  • スイッチのケース数。
  • 関数へのパラメーターの数。
  • 単一階層内のクラスの数(継承または包含のいずれか)。

他にどのような制御構造/言語機能にこのような制限がありますか?言語標準は、これらの制限(おそらく実装の最小要件)について何かを述べていますか?特定のコンパイラ/実装でこのような特定の言語制限に遭遇した人はいますか?

編集:if上記の形式のステートメントは実際に「ネスト」されていることに注意してください。これは次と同等です。

if (a) { //...
}
else {
    if (b) { //...
    }
    else {
        if (c) { //...
        }
        else { //...
        }
    }
}
4

4 に答える 4

11

VisualC++コンパイラの制限

C ++標準では、さまざまな言語構造の制限が推奨されています。以下は、VisualC++コンパイラが推奨される制限を実装していない構造のリストです。最初の数値は推奨される制限であり、2番目の数値はVisualC++によって実装される制限です。

  • 複合ステートメント、反復制御構造、および選択制御構造のネストレベル[256](256)。

  • 1つのマクロ定義のパラメーター[256](127)。

  • 1回のマクロ呼び出しでの引数[256](127)。

  • 文字列リテラルまたはワイド文字列リテラル(連結後)の文字[65536](65535)。

  • 単一のstruct-declaration-list[256](16)内のネストされたクラス、構造体、または共用体定義のレベル。

  • コンストラクター定義のメンバー初期化子[6144](約600、メモリー依存、/ Zmコンパイラー・オプションで増加する可能性があります)。

  • 1つの識別子のスコープ資格[256](127)。

  • ネストされた外部仕様[1024](10)。

  • テンプレート宣言のテンプレート引数[1024](64)。

于 2010-01-22T18:25:28.080 に答える
6

言語標準は、これらの制限(おそらく実装の最小要件)について何かを述べていますか?

いいえ、標準ではこれに最小制限は設定されていません。ただし、実装では、制限を超えたときに不明な方法で失敗するのではなく、そのようなものに厳しい制限を設定して文書化することをお勧めします。

編集:標準では、付録Bにいくつかの最小制限が推奨されています-ここに投稿するには本当に多すぎます。いずれにせよ、それらは助言です。

制限により、以下に説明するものなどを含む数量が制限される場合があります。各数量に続く括弧内の数字は、その数量の最小値として推奨されます。ただし、これらの数量は単なるガイドラインであり、コンプライアンスを決定するものではありません。

于 2010-01-22T17:44:42.223 に答える
3

Cは、実装がいくつかの制限のそれぞれのインスタンスを含むプログラムを変換できなければならないことを指定します。最初の制限は、127のネストレベルのブロックの制限です。(ISO / IEC 9899:1999の5.2.4.1)

Cは、127以下のネストレベルを含む有効なプログラムを翻訳する必要があるとは言っていません。他の方法では不当に大きくなる可能性があります。理論的根拠は、ポータブルプログラムが持つことができるある程度の期待を設定する一方で、小さな実装と小さなシステムを対象とする実装を除外しないようにすることでした。

つまり、127を超えるネストレベルが必要な場合は、実装のドキュメントを参照して、より多くの数をサポートすることが保証されているかどうかを確認する必要があることを意味します。

于 2010-01-22T18:04:15.820 に答える
3

スコーピング全体をベッドに置くために、以下は合法的なC++コードです。

int main() {
    if ( int x = 1 ) {
    }
    else if ( int x = 2 ) {
    }
}

ifとelseifの両方が同じスコープにある場合はそうではありません。おそらく私のコメントによって引き起こされた、多くの誤解があったと思います。

The compiler cares a great deal about scope. 

もちろんこれは真実ですが、この状況では役に立たないかもしれません。

于 2010-01-22T18:39:21.287 に答える