C言語コンパイラは、変数名を何文字識別するのか、規格の記述についてまとめました。
識別子とは
変数名は、識別子のひとつです。JIS X 3010:2003(ISO/IEC 9899:1999)から引用します。
識別子は,次のいずれか一つを表す。
JIS X 3010:2003 6.2.1
− オブジェクト
− 関数
− 構造体,共用体,又は列挙体のタグ又はメンバ
− 型定義名
− ラベル名
− マクロ名
− マクロ仮引数
規格では、識別子が該当するものを示すことによって定義しています。関数内で使うローカル変数は、一番上のオブジェクトに該当します。
規格のバージョン
ISO/IEC 9899 は、何回か改訂されています。バージョンについてまとめます。
- C90:1990年に発行されたため、「C90」と呼ばれています。ISO規格がベースとした ANSI規格が1989年に発行されたため、「C89」とも呼ばれることがありますが、「C89」と「C90」は言語仕様として差がありません。多くの人が C言語と認識している多くの仕様がこのバージョンの仕様に基づいていると思われます。
- C99:1999年に発行されました。これより後に続く規格と比較すると大きく変わりました。
- C11:2011年に発行されました。いくつかの仕様が追加されました。
- C17:2018年に発行されました。2017年に規格発行の準備を予定していたため「C17」と呼ばれています。発行年に合わせて「C18」と呼ぶ場合があるかもしれません。C11 の仕様欠陥の修正が主だと認識されています。
規格として定まっていること
C90
C90では、翻訳限界と呼ばれるコンパイラが処理できなくてはならない最低限の基準を示しています。そこでは、以下のように記述されています。
内部識別子又はマクロ名において意味がある先頭の文字数(31)
JIS X 3010:1993 5.2.4.1
関数内の変数名の先頭31文字だけを切り取って処理しても、それはC90準拠のコンパイラと主張することができます。
C99
C99の記述は以下です。
内部識別子又はマクロ名において意味がある先頭の文字数[各国際文字名又は各ソース拡張文字は,1個の文字とみなす。](63)
JIS X 3010:2003 5.2.4.1
文字についての追加の記述がありますが、意味がある文字数は、31文字から63文字に増えました。
C11以降
C11以降は、JISとして出版されていませんが、ISO(英文)の記述は、C99から変更はありませんでした。少なくとも先頭から63文字を読むことを要求しています。
実際に処理系はどうなっているのか
規格が定める、識別子の意味がある先頭の文字数は、案外短いと感じるプログラマはいるかもしれません。それでは、実際のコンパイラはどうなっているでしょうか。
現在、使用されている多くのコンパイラは、メモリが許す限り内部識別子を処理する仕様を採用しており、この意味で処理系の限界はない、と言えます。
規格では、いろいろ定めているけど、実用的には心配するな、ということです。
最後に
この記事では、競技プログラミングについての記事がほとんどです。ただし、わたくしの本業は、品質基準が厳しい製品で動作するソフトウェアの開発です。CもしくはC++の(細かいと思われる)言語仕様についても紹介していくことにしました。
C言語を使いこなしていきましょう!