2012-05-21 102 views
19

在標準庫(glibc)中,我看到用前導雙下劃線定義的函數,例如sys/mman.h中的__mmap。什麼目的?我們又如何調用一個函數mmap,這個函數似乎沒有在任何地方聲明。我的意思是我們包括sys/mman.h那,但sys/mman.h不宣佈mmap,它只宣佈__mmap開頭的雙下劃線的含義

+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

從GNU手冊:

除了本手冊中記載的名稱,保留名稱 包括所有外部標識符(全局函數和變量) 開始以下劃線(「_」)和所有標識符,不管使用 是以兩個下劃線還是下劃線開頭,後面跟着一個大寫字母 是保留名稱。這樣庫和頭文件就可以定義用於內部目的的函數,變量和宏,而不會與用戶程序中的名稱發生衝突。

這是C和C++供應商也使用的慣例。

5

具有前導雙下劃線的名稱由實現(編譯器/標準庫/等)保留供內部使用。他們不應該出現在你的代碼中。這個保留的命名空間的目的是爲了提供他們可以使用的系統頭名稱,而不會與程序中使用的名稱發生衝突。

+0

我喜歡你的回答,對我很友善。 –

6

ISO 9899:2011

7.1.3保留標識符

每個頭聲明或定義在其相關聯的 子條款中列出的所有的標識符,並且任選地聲明或定義在其相關聯的未來庫中列出的標識符 方向子條款和 標識符,該標識符總是被保留用於任何用途或用作 文件範圍標識符。

- 這與 下劃線和大寫字母或另一個下劃線開頭的所有標識符 總是保留用於任何用途

- 以 下劃線開頭的所有標識符始終保留用作普通標籤名稱空間和標籤名稱空間中文件範圍爲 的標識符。