C で定義されたステートメントの最大長はありますか?
コンパイラは gcc
標準では、最小翻訳制限が指定されています。
5.2.4.1 翻訳の制限
1 実装は、以下の制限のすべてのインスタンスを少なくとも 1 つ含む少なくとも 1 つのプログラムを変換および実行できなければなりません。
[...]
— 論理ソース行に 4095 文字
ただし、標準では、「実装では、可能な限り固定の翻訳制限を課すことは避けるべきである」ことが推奨されています。
論理ソース行はバックスラッシュと改行のスプライシング (5.1.1.2:1.2) の結果であるため、これはステートメント内の文字数の最小制限を直接カバーしません。
ただし、別の翻訳制限要件は次のとおりです。
— 文字列リテラル内の 4095 文字 (連結後)
文字列リテラルはステートメントでのみ使用できるため、実装では少なくとも 1 つの 4095 文字のステートメントを受け入れる必要があります。
リテラルを無視すると、次のこともわかります。
— 1 回の関数呼び出しで 127 個の引数
関数呼び出しには、引数ごとに少なくとも 2 文字、さらに呼び出し ( f(0,0,...);
) に 4 文字を含める必要があるため、行の長さの最小制限は 260 になります。
C 標準は、コンパイラーが受け入れなければならない言語の複雑さにさまざまな下限を定めていますが、ステートメント自体の長さの制限は定めていません。
§5.2.4.1 翻訳の制限
実装は、次の制限のすべてのインスタンスを少なくとも 1 つ含む少なくとも 1 つのプログラムを変換および実行できる必要があります。18)
- 127 レベルのブロックのネスト
- 条件付き包含の 63 のネスト レベル
- 宣言内の算術、構造体、共用体、または void 型を変更する 12 個のポインター、配列、および関数宣言子 (任意の組み合わせ)
- 完全な宣言子内の括弧で囲まれた宣言子の 63 のネスト レベル
- 完全な式内の括弧で囲まれた式の 63 のネスト レベル
- 内部識別子またはマクロ名の最初の 63 文字 (各ユニバーサル文字名または拡張ソース文字は 1 文字と見なされます)
- 外部識別子の有効な最初の 31 文字 (0000FFFF 以下の短い識別子を指定する各ユニバーサル文字名は 6 文字と見なされ、00010000 以上の短い識別子を指定する各ユニバーサル文字名は 10 文字と見なされ、各拡張ソース文字は対応する普遍的な文字名があれば、それと同じ文字数) 19)
- 1 つの翻訳単位に 4095 個の外部識別子
- 1 つのブロックで宣言されたブロック スコープを持つ 511 個の識別子
- 1 つの前処理翻訳単位で同時に定義される 4095 のマクロ識別子
- 1 つの関数定義で 127 個のパラメーター
- 1 回の関数呼び出しで 127 個の引数
- 1 つのマクロ定義で 127 個のパラメーター
- 1 回のマクロ呼び出しで 127 個の引数
- 論理ソース行に 4095 文字
- 文字列リテラルで 4095 文字 (連結後)
- オブジェクトで 65535 バイト (ホスト環境のみ)
- #include ファイルの 15 のネスト レベル
- switch ステートメントの 1023 個のケース ラベル (ネストされた switch ステートメントのラベルを除く)
- 1 つの構造体または共用体に 1023 メンバー
- 1 つの列挙で 1023 個の列挙定数
- 単一の struct-declaration-list での 63 レベルのネストされた構造体または共用体の定義
18)実装は、可能な限り固定の翻訳制限を課すことを避けるべきです。
19)「将来の言語の指示」(6.11.3) を参照してください。
§6.11.3 外部名
外部名の意味を 255 文字未満に制限する (各ユニバーサル文字名または拡張ソース文字を 1 文字と見なす) ことは、既存の実装に対する譲歩である時代遅れの機能です。
ご覧のとおり、脚注 18 はそのような制限を課すことを思いとどまらせます。
とはいえ、制限を侵害するステートメントが 1 つでもあるのは見たくありません。人間が書いたものではなく、機械で生成した方がよいでしょう。