C には、<stdio.h>、<string.h>、<stdlib.h> などの 17 個の標準ヘッダーがあります。これらのヘッダーは Solaris に標準で付属しており、/user/include に置かれています。C++ にも同様のヘッダーがありますが、さまざまな宣言の名前が大域の名前空間とstd 名前空間の両方に存在するという条件が付加されています。管理上の理由から、C++ コンパイラでは、/usr/include ディレクトリにあるヘッダーはそのまま残して、C++ 用のヘッダーを別に用意しています。
また、C++ には、C 標準ヘッダー(<cstdio>、<cstring>、<cstdlib>) のそれぞれについても専用のバージョンがあります。C++ 版の C 標準ヘッダーでは、宣言名は std 名前空間にのみ存在します。C++ には、32 個の独自の標準ヘッダー(<string>、<utility>、<iostream>など) も追加されています。
標準ヘッダーの実装で、C++ ソースコード内の名前がインクルードするテキストファイル名として使用されているとしましょう。たとえば、標準ヘッダーの <string> が、あるディレクトリにある string というファイルを参照するものとします。この実装には、次の欠点があります。
ファイル名に接尾辞がない場合、ヘッダーファイルだけ検索したり、ヘッダーファイル用のメークファイルを作成したりできない
コンパイラのコマンド行に -I/usr/include を指定すると、コンパイラ専用の include ディレクトリの前に /usr/include が検索されるため、正しいバージョンの標準 C ヘッダーが検出されない
string というディレクトリまたは実行可能プログラムがあると、そのディレクトリまたはプログラムが標準ヘッダーファイルの代わりに検出される可能性がある
.KEEP_STATE が有効なときのメークファイルのデフォルトの相互依存関係により、標準ヘッダーが実行可能プログラムに置き換えられる可能性がある
こうした問題を解決するため、コンパイラの include ディレクトリには、ヘッダーと同じ名前を持つファイルと、一意の接尾辞 .SUNWCCh を持つ、そのファイルへのシンボリックリンクが含まれています (SUNW はコンパイラに関係するあらゆるパッケージに対する接頭辞、CC は C++ コンパイラの意味、.h はヘッダーファイルの通常の接尾辞)。つまり <string> と指定された場合、コンパイラは <string.SUNWCCh> と書き換え、その名前を検索します。接尾辞付きの名前は、コンパイラ専用の include ディレクトリにだけ存在します。このようにして見つけられたファイルがシンボリックリンクの場合 (通常はそうである)、コンパイラは、エラーメッセージやデバッガの参照でそのリンクを 1 回だけ間接参照し、その参照結果 (この場合は string) をファイル名として使用します。ファイルの依存関係情報を送るときは、接尾辞付きの名前の方が使用されます。
この名前の書き換えは、2 つのバージョンがある 17 個の標準 C ヘッダーと 32 個の標準 C++ヘッダーのいずれかを、パスを指定せずに山括弧 < > に囲んで指定した場合にだけ行われます。山括弧の代わりに引用符が使用されるか、パスが指定されるか、他のヘッダーが指定された場合、名前の書き換えは行われません。次の表は、よくある書き換え例をまとめています。
ソースコード |
コンパイラによる検索 |
注釈 |
---|---|---|
<string> |
string.SUNWCCh |
C++の string テンプレート |
<cstring> |
cstring.SUNWCCh |
C の string.h の 1 バージョン |
<string.h> |
string.h.SUNWCCh |
C の string.h |
<fcntl.h> |
fcntl.h |
標準 C および C++ヘッダー以外 |
“string” |
string |
山括弧ではなく、引用符付きの場合 |
<../string> |
../string |
パス指定がある場合 |