[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.3 その他の VMS にまつわる問題

GCC は、main に対し、明示的に戻り値を指定しない場合は、 デフォルトで 1 を返すように自動的に設定を行う。 1 を返すと、通常の成功終了を示す状況コードとして VMS が解釈する。 GCC のバージョン 1 はこのデフォルトを提供していなかった。

VMS 上の GCC は GNU アセンブラ、GAS と共にしか動作しない。 VMS のデバッガに意味のあるデバッグ情報を生成するには バージョン 1.37 以降 の GAS を使う必要がある。GAS で生成したオブジェクトファイルは 普通の VMS リンカを使う。

GCC の以前のバージョンでは、生成されたコードを共有可能な ‘VAXCRTL’ ライブラリとリンクするとおかしな結果が出ることがときどき あった。現在では、正しく動作するはずである。

const グローバル変数の使用についての注意。 const 修飾子は、その変数を使っている全てのソースファイルの、 その変数のあらゆる外部宣言で指定しなければならない。そうしないと、 リンカがその変数に対する属性に不一致がある旨の警告を発する。 この警告が出てもプログラムは動作するが、その変数は書き込み可能な 記憶域に置かれてしまう。

VMS のリンカは、グローバルシンボルの大文字と小文字を区別するが、 ほとんどの VMS コンパイラはすべてのグローバルシンボルを大文字に 変換し、ほとんどの実行時ライブラリルーチンも名前が大文字である。 これらのルーチンの呼出しを信頼できるものとするために、GCC(GASによって) はグローバルシンボルを、他の VMS コンパイラのように、大文字に変換する。 しかし、C では普通大文字小文字を区別するので、GCC(GAS経由で)は、 通常の C の振るまいを、全てが小文字ではない名前をそれぞれ特別な 処理(オーグメント)をすることで 保存しようとする。オーグメントは、名前を最大 23 文字で打ち切り、その後に 23文字の大文字小文字のパターンをエンコードした文字群を付ける。 ドル記号が一つでも含まれている名前は例外であり、オーグメントはせず、 直接大文字に変換する。

名前のオーグメントは、他のコンパイラにより生成されたコンパイル 済みライブラリ(例えば Xlib 等)を使うプログラムにとっては悪い結果を もたらす。GCC のオプション ‘/NOCASE_HACK’ を指定すると オーグメントを禁止できる。C の外部関数と外部変数を通常の VMS での 場合のように大文字小文字の区別をしない。これは VMS では動作するものの、 他のシステムへの移植性はない。GCC のオプション ‘/NAMES’ も またグローバル名の取扱いの制御方法を提供している。

関数名と変数名は GNU C++ ではいくらか異なった取扱いになる。 GNU C++ コンパイラは、関数名について 名前のマングリングを 行う。これは、関数名に、その関数の取る引数のデータ型を記述する情報 を追加するものである。この結果起きることの一つは、関数名が非常に 長くなりうる事である。VMS のリンカは名前の先頭 31 文字しか認識しないので、 各関数と変数が 31 文字で表現可能な一意的な名前を持つことを保証するために 特別な処理が行われる。

その名前(必要とされるなら、名前のオーグメントを加えたもの)の長さが、 32 文字未満であるなら、特別な処理は行われない。 名前が 31 文字より長ければ、アセンブラ(GAS)がその関数名に基づいた ハッシュ文字列生成し、関数名を 23 文字に切り詰め、その後にハッシュ文字列を 追加する。GCC にオプション ‘/VERBOSE’ を指定すると、 アセンブラは、打ち切りされるシンボル毎に完全な名前と打ち切り後の 名前を表示する。

/NOCASE_HACK’ オプションは、libg++ を使用するプログラムを コンパイルするときは使うべきでない。libg++ には、大文字小文字を区別しない 環境では、区別できなくなってしまうオブジェクトの実体(例えば、 Filebuffilebuf) がたくさんある。 これは、オーグメントを選択的に禁止する必要がある場合につながる (例えば、libg++ と Xlib を同じプログラムで使っている場合)。 それを行うような特別な機能は存在しないが、オーグメントを禁止したい、 大文字小文字の混じったシンボル毎に、マクロを定義することでそういう結果 を得ることは可能である。そのマクロは、それ自身の小文字版に展開される 必要がある。例えば、以下のようにする。

 
#define StuDlyCapS studlycaps

これらのマクロ定義は、ヘッダファイルに置くことで、読者のソースコードの 変更回数を最小限に押さえることができるだろう。


This document was generated using texi2html 1.78.