2012-05-21 22 views
19

標準ライブラリ(glibc)には、sys/mman.h__mmapのような先頭の二重下線で定義された関数があります。目的は何ですか?そして、どこでも宣言されていないと思われる関数mmapをどう呼び出すことができますか?つまり、sys/mman.hが含まれていますが、sys/mman.hmmapと宣言されておらず、__mmapと宣言しています。 GNUのマニュアルから最初の二重アンダースコアの意味

+3

ダブルアンダースコア:http://stackoverflow.com/questions/224397/why-do-people-use-double-underscore-so-much-in-c(質問はC++は述べていますが、 '__'ですANSI C標準からも同様です)。私の 'sys/mman.h'のバージョンでも、' mmap'が定義されています。 – birryree

+0

'__mmap'はglibcによってどこでも宣言されていません。あなたが何を言っているのかは分かりません。 –

+0

glibcヘッダーではなく、カーネルヘッダーを調べていますか? –

答えて

16

:このマニュアルに記載名に加えて

、 は、アンダースコア(「_」)で始まることを、すべての外部識別子(グローバル関数や変数)が含ま 予約名とすべての2つのアンダースコアまたはアンダースコアの後に 大文字を続けて使用する に関係なく、識別子は予約名です。これは、ライブラリーと ヘッダーファイルが、ユーザープログラム内の名前と競合することなく、内部で の目的のために関数、変数、およびマクロを定義できるようにするためです。

これは、CおよびC++ベンダーでも使用されている規則です。

5

先頭に二重のアンダースコアが付いた名前は、実装(コンパイラ/標準ライブラリ/ etc)によって内部的に使用されるために予約されています。それらは決してあなたのコードに表示されるべきではありません。この予約された名前空間の目的は、プログラムで使用されている名前と潜在的に衝突することなく使用できるシステムヘッダー名を与えることです。 ISO 9899

+0

私は親切なあなたの答えが好きです。 –

6

:2011

7.1.3予約識別子

各ヘッダーが宣言またはその 関連箇条に記載されているすべての識別子を定義し、必要に応じて宣言またはそれに関連する将来のライブラリにリストされた識別子 を定義指示副節および 識別子は、常に使用のために、またはファイルスコープ識別子 として使用するために予約されています。

- アンダースコアと大文字のいずれか、または別のアンダースコアで始まるすべての識別子は常に使用するために予約 です。

- アンダースコアで始まるすべての識別子は、通常の名前空間とタグ名空間の両方でファイルスコープ の識別子として使用するために予約されています。

関連する問題