2010-01-03 86 views
0

工會epoll_data_t樣子:epoll_data_t問題(特別是關於C的數據類型)

typedef union epoll_data { 
    void *ptr; 
    int fd; 
    __uint32_t u32; 
    __uint64_t u64; 
} epoll_data_t; 

這更多的是一種通用C問題,但爲什麼用領先的雙下劃線__uint {} 32,64類型,而不是隻有uint {32,64}沒有下劃線?我不明白爲什麼/何時使用下劃線版本,但我認爲沒有下劃線的uint32是在公開可修改的外部世界中使用的合適的東西。

回答

1
從維基百科[ http://en.wikipedia.org/wiki/Underscore]

許多衝突

直接的 外部標識符鏈空間 這潛在地交織在一起的各種高電平 編譯器,運行時庫所需的每個這些編譯的 生成的代碼 內是可能的,編譯器 生成的輔助函數,以及 程序啓動代碼,其中部分 分數不可避免地從 系統彙編語言編譯而來。在此 衝突域中,下劃線 字符迅速成爲 區分外部鏈接 空間的主要機制。 C 編譯器通常的做法是在所有外部範圍下加上前導 下劃線 程序標識符以避免衝突 與運行時 語言支持的貢獻。此外,當在 C/C++編譯器需要引入 名轉換成外部連接作爲 翻譯過程的一部分,這些名稱 常常與一些 多個前導或尾隨 下劃線的組合區分開。

+0

這實際上與這個特定的問題沒有關係 - 它是關於類型名稱,它在C中沒有鏈接。 – caf 2010-01-04 08:53:59

1

爲編譯器/庫供應商保留了一個領先的下劃線,以避免在全局名稱空間中創建與其客戶創建的符號相沖突的符號。不幸的是,客戶也一直在使用它來進行自己的「系統級」聲明,第三方庫供應商也一樣,迫使供應商開始使用兩個下劃線。帶有3個下劃線的符號已經在野外發現,但尚未廣泛傳播。

2

固定寬度整數類型用C99標準化。在此之前,編譯器和庫作者介紹了他們自己的類型,其中這些類型可能是一種補遺; afaik MS仍不會運送stdint.h與Visul Studio。