LoginSignup
31

More than 5 years have passed since last update.

C の翻訳限界

Posted at

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 翻訳限界 より抜粋

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31