__mmap
標準ライブラリ (glibc) では、 inのように先頭に 2 つのアンダースコアを付けて定義された関数を目にしsys/mman.h
ます。目的は何ですか?mmap
そして、どこにも宣言されていないように見える関数をどのように呼び出すことができますか。sys/mman.h
つまり、そのために含めますが、 をsys/mman.h
宣言せずmmap
、 のみを宣言し__mmap
ます。
3 に答える
GNUのマニュアルから:
このマニュアルに記載されている名前に加えて、予約名には、アンダースコア ('_') で始まるすべての外部識別子 (グローバル関数および変数) と、2 つのアンダースコアまたはアンダースコアの後に大文字は予約名です。これは、ユーザー プログラム内の名前と競合するリスクなしに、ライブラリ ファイルとヘッダー ファイルが内部目的で関数、変数、およびマクロを定義できるようにするためです。
これは、C および C++ ベンダーによっても使用される規則です。
ISO9899:2011
7.1.3 予約済み識別子
各ヘッダーは、関連する副次節にリストされているすべての識別子を宣言または定義し、オプションで、関連する将来のライブラリ指示の副次節にリストされている識別子と、任意の使用またはファイルスコープ識別子として使用するために常に予約されている識別子を宣言または定義します。
— アンダースコアと大文字または別のアンダースコアで始まるすべての識別子は、 常に予約されています。
— アンダースコアで始まるすべての識別子は、通常の名前空間とタグ名空間の両方で、ファイル スコープの識別子として使用するために常に予約されています。
先頭に 2 つのアンダースコアが付いた名前は、実装 (コンパイラ/標準ライブラリなど) による内部使用のために予約されています。それらはコードに表示されるべきではありません。この予約された名前空間の目的は、システム ヘッダーに、プログラムで使用される名前と潜在的に衝突することなく使用できる名前を与えることです。