2017-01-16 10 views
0

Cで持つことができる変数/識別子の最大量は?コンパイラ理論とインタプリタの設計を学びながら、識別子とその値がシンボル辞書/ハッシュマップを介して保存されることを学びました。Cで、あなたが持つことができる識別子の最大量はいくらですか?

ハッシュマップ/ディクショナリにRAM制限があることを考慮すると、Cプログラミング言語で可能なハッシュされた識別子の最大量はいくらですか?

+2

私は一般的な答えがあるとは思わないこれは実装固有のものであり、コンパイラが実行されているマシンにも依存する可能性があるためです。 –

+1

詳細情報なしで言うのは難しいです。どのプラットフォーム(CPU/OS)ですか?コンパイラは何ですか?それでも、コンパイラ作成者が行ったことに依存します。 – uliwitness

答えて

4

標準では制限が指定されていないため、コンパイラやインタープリタの選択肢がありません。

最後のバイナリで識別子をコンパイルできることにも注意してください。

2

ありC規格のいずれかの情報ではないようですが、C++標準では、おそらくガイドラインとして使用することができますいくつかの最小推奨言及しない:

附属書B(参考) 導入量を [implimits]

(2.8) - 1つのブロック[1 024]で宣言されたブロックスコープの識別子。

10

一般に、識別子の数はの実装品質です。私が知っているすべてのコンパイラは、利用可能なリソース(メモリ)によってのみ制限されています。

あり、しかし、私が識別子のC標準、C11、力点における最小の限界の(ほとんど役に立たない)仕様:

5.2.4。ブロック

    • 127ネスティングレベル:実装は 次の制限の一つ一つの少なくとも一つのインスタンスを含む少なくとも1つの プログラムを翻訳して実行することができなければならない1つの翻訳限界

      複雑な包含レベルのネストレベル

    • 宣言の算術、構造体、共用体、または空の型を変更するポインタ、配列、関数宣言子
    • 完全な宣言内括弧宣言子のの
    • 63ネスティングレベル完全式中括弧式の
    • 63ネスティングレベル
    • 63の著しい初期内部識別子またはマクロ名(各ユニバーサル文字名の文字または拡張ソース文字
    • 外部識別子に31の重要な初期文字(短い識別子0000FFFFまたはを指定する各汎用文字名は6文字とみなされ、各汎用文字名 は00010000以上の短い識別子を指定します。考慮する10 文字、及び あれば、各拡張ソース文字は、対応する汎用文字名と同じ文字 数とみなされる)1個の翻訳単位で
    • 4095外部識別子に宣言ブロックスコープ付き
    • 511識別子一つのブロック
    • 4095マクロ識別子は、同時に一つの関数定義の一方前処理翻訳単位に
    • 127個のパラメータを定義
    • 一つの関数呼び出しで個の
    • 127引数つのマクロ定義で
    • 127パラメータつのマクロ呼び出しで
    • 127引数論理ソース線に
    • 4095文字(連結後の)文字列リテラルで
    • 4095文字
    • オブジェクト内の
    • 65535バイト(ホスト環境でのみ)#includeさファイル用
    • 15のネストレベル(任意のためのものを除くswitchステートメントの
    • 1023 caseラベルネストされたswitch文)単一の列挙に
    • 1023メンバー 単一構造体または共用で列挙定数単一構造体宣言リスト内のネストされた構造体または共用体定義の
    • 63レベル
  • "少なくとも1つのプログラム"の部分のため、ほとんど役に立たないと思っています。私はその意図ははっきりしていると思いますが、あなたのベンダーがこれらの制限をテストするコンパイラを正確に翻訳できるコンパイラを販売している場合、あなたはお金を返さないでしょう:-)

    +0

    "単一の構造体または共用体で1024のメンバー"興味深い制限 – Nergal

    +0

    @Nergal 1023を意味しましたか? – Jens

    +0

    はい、タイプミスですが、どうして2^10-1という制限がありますか? – Nergal

    関連する問題