web-dev-qa-db-ja.com

関数宣言のパラメーターの最大数

関数定義のパラメーターの最小数がゼロであることを知っていますが、関数定義のパラメーターの最大数はいくつですか?私は、知識と好奇心のために質問をします。実際の関数を書くつもりはありません。

27
Nawaz

はい、実装によって課せられる制限があります。あなたの答えは、C++標準からの次の抜粋の太字のテキストで与えられます。

1. C++言語


付録B-実装数量

  1. コンピュータは有限であるため、C++の実装では、正常に処理できるプログラムのサイズが必然的に制限されます。 すべての実装は、既知の制限を文書化するものとします。この文書では、固定制限が存在する場合はそれを引用し、使用可能なリソースの関数として変数制限を計算する方法を示したり、固定制限が存在しないか不明であったりする場合があります。 。

  2. 制限は、以下またはその他に記載されているものを含む数量を制限する場合があります。 各数量に続く括弧付きの数値は、その数量の最小値として推奨されます。ただし、これらの数量はガイドラインにすぎず、コンプライアンスを決定するものではありません。
    —複合ステートメント、反復制御構造、および選択制御構造のネストレベル[256]。
    —条件付き包含のネストレベル[256]。
    —宣言の算術型、構造型、共用体、または不完全型を変更するポインター、配列、および関数宣言子(任意の組み合わせ)[256]。
    —完全な式[256]内の括弧で囲まれた式のネストレベル。
    —内部識別子またはマクロ名の文字数[1 024]。
    -外部識別子の文字数[1 024]。
    — 1つの変換単位の外部識別子[65 536]。
    —ブロックスコープが1つのブロックで宣言された識別子[1 024]。
    — 1つの変換単位で同時に定義されるマクロ識別子[65 536]。
    — 1つの関数定義のパラメーター[256]。
    — 1つの関数呼び出しの引数[256]。

    — 1つのマクロ定義のパラメーター[256]。
    — 1つのマクロ呼び出しの引数[256]。
    — 1つの論理ソース行の文字[65 536]。
    —文字列リテラルまたはワイド文字列リテラル(連結後)の文字[65 536]。
    —オブジェクトのサイズ[262 144]。
    — #includeファイルのネストレベル[256]。
    — switchステートメントのケースラベル(ネストされたswitchステートメントのケースラベルを除く)[16 384]。
    —単一のクラス、構造体、または共用体のデータメンバー[16 384]。
    —単一の列挙内の列挙定数[4 096]。
    —単一のstruct-declaration-list [256]内のネストされたクラス、構造、または共用体定義のレベル。
    — atexit()[32]によって登録された関数。
    —直接および間接基本クラス[16 384]。
    —単一クラスの直接基本クラス[1024]。
    —単一クラス[4 096]で宣言されたメンバー。
    —クラス内の最終的なオーバーライド仮想関数、アクセス可能かどうか[16 384]。
    —クラスの直接および間接の仮想ベース[1 024]。
    —クラス[1 024]の静的メンバー。
    —クラスのフレンド宣言[4 096]。
    —クラス[4 096]のアクセス制御宣言。
    —コンストラクター定義のメンバー初期化子[6 144]。
    — 1つの識別子のスコープ修飾[256]。
    —ネストされた外部仕様[1 024]。
    —テンプレート宣言のテンプレート引数[1 024]。
    —再帰的にネストされたテンプレートのインスタンス化[17]。
    —試行ブロックあたりのハンドラー[256]。
    —単一の関数宣言に仕様をスローします[256]。

その上、それはまた$ 18.3/6で言います、

実装制限:実装は、少なくとも32個の関数の登録をサポートする必要があります。

44
Nawaz

2. C言語


5.2.4.1変換の制限


実装はtranslateおよびexecuteat少なくとも1つのプログラムすべての1つのインスタンスの少なくとも1つのインスタンス以下の制限を含みます:
— 127のネストレベルのブロック
—条件付き包含の63のネストレベル
—宣言の算術型、構造体、共用体、または不完全型を変更する12個のポインター、配列、および関数宣言子(任意の組み合わせ)
—完全な宣言子内の括弧で囲まれた宣言子のネストレベル63
—完全な式内の括弧で囲まれた式のネストレベル63
—内部識別子またはマクロ名の63の重要な最初の文字(各ユニバーサル文字名または拡張ソース文字は単一の文字と見なされます)
—外部識別子の31の重要な最初の文字(各ユニバーサル文字名
0000FFFF以下の短い識別子を指定すると6文字と見なされ、00010000以上の短い識別子を指定する各ユニバーサル文字名は10文字と見なされ、各拡張ソース文字は対応する文字と同じ数の文字と見なされますユニバーサルキャラクター名(存在する場合)
— 1つの翻訳単位に4095の外部識別子
— 1つのブロックで宣言されたブロックスコープを持つ511個の識別子
— 1つの前処理変換ユニットで同時に定義された4095個のマクロ識別子
— 1つの関数定義に127個のパラメーター
— 1つの関数呼び出しに127個の引数

— 1つのマクロ定義に127個のパラメーター
— 1回のマクロ呼び出しで127個の引数
—論理ソース行に4095文字
—文字列リテラルまたはワイド文字列リテラルの4095文字(連結後)
—オブジェクトの65535バイト(ホスト環境のみ)
— #includedファイルの15のネストレベル
— switchステートメントの1023ケースラベル(ネストされたswitchステートメントのラベルを除く)
—単一の構造または共用体の1023メンバー
—単一の列挙内の1023個の列挙定数
—単一のstruct-declaration-list内のネストされた構造または共用体定義の63レベル

しかし、それはノートで言う、

13)実装では、可能な限り、固定された翻訳制限を課すことは避けてください。

24
Nawaz

以前の回答者が十分に述べたように、パラメーターの数はC++コンパイラーに依存します。コンパイラの制限は、ハードウェア環境によって課せられた制限が原因である可能性があります。

たとえば、 VAX CPUアーキテクチャ は引数の数を保持する8ビットのフィールドを使用するため、準拠するVAXコードは255を超えるパラメーターを渡すことができません。

同様に、 Intel 8048ファミリ のような多くの小さなプロセッサはメモリに制約があるため、4つ以上のパラメータを使用すると、ほとんどのCおよびC++コンパイラが悲しみを与えます。多くの主流の開発者は8048を冷笑しているかもしれませんが、その子孫は、最も広く導入されているCPUの1つであり、そのほとんどが組み込みデバイスです。

多くのRISCアーキテクチャの実装では、スタックではなく、レジスタを使用してパラメータの受け渡し方法を指定しています。基本的なARM CPUには16個のレジスタしかありません。パラメーターの最大数は、パラメーターを渡すコードを生成する方法に影響するコンパイラーのコマンドラインオプションに依存する可能性があります。スタックにプッシュされました。

これらの例が過度に制限的であると思われる場合は、 Palm OS限定 単一パラメーターへのC関数であり、タイプはintまたはvoid *でなければならないことを考慮してください。

7
wallyk

もちろん、Cでこのように多数の引数を使用して関数を記述している場合、おそらくプログラムの設計を再考したいと思います。

4
Sri Raghavan