外部識別子の有意先頭文字数の制限に関して

先日行われたTOPPERSプロジェクトのコンポーネント仕様WGの合宿で話題になったので、少しだけ書き留めておきます。

Cの外部識別子の有意先頭文字数についてなのですが、C90では(規格上は)6文字以内でしかも大文字小文字の区別なしということになっています。C99では、それが31文字まで拡張されています。ただし、C99に対応していない処理系の場合も、現在使われているものについていえば、有意先頭文字数31文字で大文字小文字の区別ありと考えて問題ないだろうと思っていました。

ところが、現実はそう甘くはありませんでした。新世代カーネルのコンフィギュレータが生成する中間ファイル(cfg1_out.c)では、比較的長めの外部識別子を使っているのですが、それが途中でちょん切れるケースが出てきたのです。調べてみると、外部識別子の有意先頭文字数は15文字(先頭に付加されるのアンダスコア等を含めて16文字)のようでした。

はっきり名前を出すと、M16C用のリンカLN30です。さらに調査してもらったところ、どうやらリンカオプションによるようで、今回に関しては比較的あっさり問題を解決できたわけですが、今後移植性を考慮する際には、外部識別子15文字も考慮に入れなければならないようです。

ところで、TECSの場合には、いろいろな文法要素を連結した名前を生成します。今のところ、名前空間が実装されていませんが、将来的に名前空間が実装されると、さらに名前が長くなることでしょう。例え、外部識別子を短くするために、名前を圧縮してマクロで置き換えるなどしても、内部識別子として保証される有意先頭文字数も31文字(C99では63文字)しかありません。

今のところ、この問題には目をつぶっているような状況ですが、いずれ直面する日も来ることでしょう。その頃には、主要な処理系の有意先頭文字数が、せめて255文字ぐらいになっていればよいのですが、なかなか難しい気がします。処理系がC++に対応している場合には、C++の有意先頭文字数は64K文字なので、Cもそれぐらいは期待できるのですが、Cしか対応していない処理系が問題なのです。

有意先頭文字数については、(少なくともDraftに目を通した限りでは)C1xでも31文字(内部識別子は63文字)のようです。仮に、C1xでの有意先頭文字数が大幅に拡張されたとしても、C99でさえこの普及状況ですから、C1xがにわかに普及するとも思えません。そうなると、いよいよ本腰を入れて対策を考えないといけなくなりそうです。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/688