簡體   English   中英

C類型命名約定,_t或ALLCAPS

[英]C type naming conventions, _t or ALLCAPS

我一直想知道是否存在任何命名競爭,例如何時對類型使用ALLCAPS以及何時附加_t (何時不使用任何東西?)。 我知道K&R曾經發布過各種有關如何使用C的文檔,但我對此一無所獲。

在C標准庫類型中, _t似乎占主導地位

time_t
clock_t
uint32_t
size_t
sig_atomic_t
...

FILEva_liststruct tm 實際是否有規則或完全武斷? 坦白地說,Microsoft始終在Windows API的ALLCAPS中使用類型名,至少看起來比C庫更一致。

根據POSIX標准實際上,在_t結尾的所有類型的名稱被保留,作為定義在這里

以“ _t”結尾的名稱保留用於其他類型名稱。

我將努力減少您對typedef的使用。 struct使用struct關鍵字,並且僅在以下兩種情況下使用typedef:(a)定義可能實現為任何形式的不透明類型,或(b)定義將來可能要更改的算術類型的別名不同的配置(例如,如果您希望能夠選擇floatdouble )。

無論如何,不​​要使用ALL CAPS,因為它丑陋難看,也不要使用_t因為它是POSIX保留的。 如果適當地給類型名加上前綴,那可能沒關系,但是最后的_t只是不必要的丑陋和不必要的不​​可移植性。 像這樣給它們foo_scalar前綴應該沒問題: foo_scalar (其中foo是您的庫/模塊的名稱)。

這完全是任意的-不同的庫編寫者/標准使用不同的約定(或根本不使用約定)。 只需為您的代碼選擇一個並保持一致即可。

由於您提到的類型可能是多年來在各種標准(例如POSIX)和不同的主要實現中積累的,因此沒有任何內容。 一個xstr例子是xstrassert ,它們都是小寫的宏。 但是,請確保您已閱讀C-FAQ 12.9,並且應該很好。

您可能還需要查找標准中有關保留標識符的部分。 這是我的N1570副本所說的:

7.1.3保留標識符

1每個標頭聲明或定義在其相關的子節中列出的所有標識符,並可選地聲明或定義在其相關的將來的庫指導子節中列出的標識符以及始終保留用於任何用途或用作文件范圍標識符的標識符。 —所有以下划線開頭,大寫字母或其他下划線開頭的標識符始終保留供任何使用。 —所有以下划線開頭的標識符始終保留為普通和標記名稱空間中的文件范圍標識符。

—下列任何子條款(包括將來的庫說明)中的每個宏名稱均保留用於指定的用途(如果包含其任何關聯的標頭); 除非另有明確說明(請參閱7.1.4)。

—在以下任何子條款(包括將來的庫說明)和errno中,具有外部鏈接的所有標識符始終保留用作具有外部鏈接的標識符。184)

—在以下任何子條款(包括將來的庫說明)中列出的每個文件范圍的標識符都保留用作宏名,並在包含任何相關標頭的情況下用作同一名稱空間中文件范圍的標識符。

2沒有其他標識符保留。 如果程序在保留它的上下文中聲明或定義標識符(而不是7.1.4允許),或者將保留標識符定義為宏名,則該行為未定義。

3如果程序刪除(使用#undef)上面列出的第一組中標識符的任何宏定義,則該行為未定義。

最常見的約定是對宏使用所有大寫(僅)(無論它是否恰好是一種類型)。

ALL CAPS最常用於常量和/或宏。 除了Windows API,我在其他任何地方都沒有遇到過它,因此不推薦使用。

正如我們從標准中可以看到的,uint8_t等是一種非常常見的命名類型的方式。 另一種常見的方式是像This僅在第一個字母大寫。

ALLCAPS通常(不是通用)用於宏,而根據我的經驗,很少用於類型定義。 我見過的最常見的類型名稱約定是LeadingUpperMixedCase或_t后綴(其他人指出這可能會導致與POSIX發生沖突)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM