2012-04-26 54 views
8

這是參考the structure for information about a file inode爲什麼`struct stat`中的字段名爲st_something?

dev_t  st_dev;  /* ID of device containing file */ 
ino_t  st_ino;  /* inode number */ 
mode_t  st_mode; /* protection */ 
nlink_t  st_nlink; /* number of hard links */ 
uid_t  st_uid;  /* user ID of owner */ 
gid_t  st_gid;  /* group ID of owner */ 
dev_t  st_rdev; /* device ID (if special file) */ 
off_t  st_size; /* total size, in bytes */ 
time_t  st_atime; /* time of last access */ 
time_t  st_mtime; /* time of last modification */ 
time_t  st_ctime; /* time of last status change */ 
blksize_t st_blksize; /* blocksize for filesystem I/O */ 
blkcnt_t st_blocks; /* number of blocks allocated */ 

我只是在尋找任何類型的答案真的。我注意到所有字段都以st_開頭,並且在互聯網上找不到一個好的解釋。

+2

表示它們包含'stat'數據。 – 2012-04-26 00:58:36

回答

15

這可以追溯到第一個C版本的很長一段路。他們沒有用於結構成員的單獨符號表,名稱被添加到全局符號表中。由於顯而易見的令人討厭的全球命名空間污染導致。解決方法與您今天在枚舉上使用的解決方法相同,爲它們加上幾個字母以避免名稱衝突。

這是一種歷史記錄。當你看到一個具有這些類型成員名稱的結構體時,你知道它是舊的

0

我假設這是一個命名約定,以便當您看到st _...時,您知道它是stat結構(以st開頭)的一部分。

+0

我不認爲這會很簡單,但看起來如此,謝謝。 – joethecoder 2012-04-26 01:00:17

4

除了漢斯的回答,我認爲名稱碰撞的事情還是現實。儘管現代C struct字段不在全局名稱空間中,但它們可能與宏定義衝突。

這是每個人通常使用大寫字母和小寫字母表示其他標識符的原因之一,但不幸的是,這並非總是可行。 C庫自身具有小寫的宏:基本上,庫中的每個函數都可能有一個宏對應的「重載」函數用於優化目的。在你的例子中,你可以很容易想象在C(POSIX,無論)中出現一個函數blksize。如果有一天會員沒有st_前綴,那麼您希望重載該功能,那麼您將遇到麻煩。

隨着C11及其使用_Generic這種宏的類型泛型宏將更加普遍。因此,如果你正在設計一個庫,這個庫被用於很多代碼中,而你沒有選擇標識符的方式,那麼使用這樣的命名約定會更好。

所有這些不僅適用於struct成員,還適用於inline函數的參數名稱和變量。

+1

一個例子是像'#define st_atime st_atim.tv_sec'這樣的宏,它使'st_atime'成爲一個不遵循範圍規則的全局名稱。 – musiphil 2013-11-06 00:40:51

相關問題