C の規格にはコンパイラの実装の都合のため、コンパイラーが最低限これ以上はサポートしなければならないという制限があります。
特に ANSI-C (C89) は制限が厳しいので、現代的なプログラミングをすると簡単に限度に達してしまう可能性があります。移植性に拘る人は気をつけましょう。特に #include の入れ子の数などは気付かずに超えてしまいます。
項目 | C89 | C99 |
---|---|---|
ブロックの入れ子のレベル数 | 15 | 127 |
条件付き取込みにおける入れ子のレベル数 | 8 | 63 |
一つの宣言中の一つの算術型,構造体型,共用体型又は不完全型を修飾するポインタ,配列及び関数宣言子(の任意の組合せ)の個数 | 12 | 12 |
一つの完結宣言子における括弧で囲まれた宣言子の入れ子のレベル数 | 31 | 63 |
一つの完結式における括弧で囲まれた式の入れ子のレベル数 | 32 | 63 |
内部識別子又はマクロ名において意味がある先頭の文字数 | 31 | 63 |
外部識別子において意味がある先頭の文字数 | 6 | 31 |
一つの翻訳単位中における外部識別子数 | 511 | 4095 |
一つのブロックで宣言されるブロック有効範囲をもつ識別子数 | 127 | 511 |
一つの前処理翻訳単位中で同時に定義されるマクロ識別子数 | 1024 | 4095 |
一つの関数定義における仮引数の個数 | 31 | 127 |
一つの関数呼出しにおける実引数の個数 | 31 | 127 |
一つのマクロ定義における仮引数の個数 | 31 | 127 |
一つのマクロ呼出しにおける実引数の個数 | 31 | 127 |
一つの論理ソース行における文字数 | 509 | 4095 |
(連結後の)単純文字列リテラル又はワイド文字列リテラル中における文字数 | 509 | 4095 |
(ホスト環境の場合)一つのオブジェクトのバイト数 | 32767 | 65535 |
#include で取り込まれるファイルの入れ子のレベル数 | 8 | 15 |
一つの switch 文(入れ子になった switch 文を除く)中における case ラベルの個数 | 257 | 1023 |
一つの構造体又は共用体のメンバ数 | 127 | 1023 |
一つの列挙体における列挙定数の個数 | 127 | 1023 |
一つのメンバ宣言並びにおける構造体又は共用体定義の入れ子のレベル数 | 15 | 63 |
atexit() によって登録される関数 | 32 | 32 |
JIS 5.2.4.1 翻訳限界 より抜粋