C言語

C言語は変数名を何文字識別するのか(続き)

前回は、内部識別子を何文字識別するのか、規格の記述についてまとめました。今回は、外部識別子について紹介します。

規格として定まっていること

内部識別子およびC言語規格のバージョンについては、前回の記事をご覧ください。

C90

C90では、翻訳限界と呼ばれるコンパイラが処理できなくてはならない最低限の基準を示しています。そこでは、以下のように記述されています。

外部識別子において意味がある先頭の文字数(6)

JIS X 3010:1993 5.2.4.1

このような名前の英小文字及び英大文字の区別を無視してもよい。

JIS X 3010:1993 6.1.2

先頭の6文字のみ意味を持ち、大文字と小文字を区別しないコンパイラもC90準拠となります。名前のバリエーションが少ないと感じます。ただし、初期のUnixのコンパイラ(リンカ)は、この仕様でした。このためにC90が採用したと考えています。

C99

C99の記述は以下です。

外部識別子において意味がある先頭の文字数[0000FFFF以下の短い識別子を表す各国際文字名は,6個の文字とみなす。00010000以上の短い識別子を表す各国際文字名は,10個の文字とみなす。各ソース拡張文字は,(もしあれば)対応する国際文字名と同じ個数の文字とみなす。](31)

JIS X 3010:2003 5.2.4.1

国際文字についての追加の記述がありますが、意味がある文字数は、6文字から31文字に増えました。また、英小文字と英大文字を区別することになりました(JIS X 3010:2003 6.4.2.1)。

この言語仕様の変更は、C90の「今後の言語の方針」6.9.1 に記載されていました。

C11以降

C11以降は、JISとして出版されていませんが、ISO(英文)の記述は、C99から変更はありませんでした。少なくとも先頭から31文字を読むことを要求しています。

ただし、C99から「今後の言語の方針」6.11.3 では、255文字を有意として、各国際文字名または、ソース拡張文字を1文字と考える旨が記載されていますが、実現されていません。

実際に処理系はどうなっているのか

外部識別子は、内部識別子よりも、意味がある先頭の文字数は短くなっています。それでは、実際のコンパイラはどうなっているでしょうか。実は内部識別子と同じです。

現在、使用されている多くのコンパイラは、メモリが許す限り外部識別子を処理する仕様を採用しており、この意味で処理系の限界はない、と言えます。

規格では、いろいろ定めているけど、実用的には心配するな、ということです。前回と同じです。

最後に

昔話ですが、1989年に初めて企業でプログラマとしてバイトしたときに、6文字有意、大文字と小文字を区別しない仕様のリンカで仕事をしたことがあります。当時でもこの制約は厳しいと考えていました。

C言語を使いこなしていきましょう!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA