2008-10-23 34 views
176

這似乎是一個簡單的問題,但我不能與堆棧溢出搜索或谷歌找到它。 _t是什麼意思?如類型後跟_t(下劃線-t)代表什麼?

int_t anInt; 

我看到了很多在C代碼爲了與關係密切的硬件我不禁想,他們是相關的。

+1

凡`int_t`定義?如果它總是被定義爲`int`,那麼它沒有用;直接使用`int`會更清晰。如果它不總是被定義爲「int」(比如說,它可能是`long int`或`short int`),那麼這是一個選擇不好並且令人困惑的名字。 – 2015-07-24 17:32:58

回答

143

正如Douglas Mayle指出的那樣,它基本上表示一個類型名稱。因此,你會不明智的結束與「_t」變量或函數的名稱,因爲它可能會造成一些混亂。除了size_t,C89標準還定義了wchar_t,off_t,ptrdiff_t,可能還有一些我忘記了。 C99標準定義了很多額外的類型,如uintptr_t,intmax_t,int8_t,uint_least16_t,uint_fast32_t等等。這些新類型在<stdint.h>中正式定義,但大多數情況下,您將使用<inttypes.h>(對於標準C標頭,這通常很不常用)包括<stdint.h>。它(<inttypes.h>)還定義了與printf()scanf()使用宏。

正如Matt Curtis指出的那樣,編譯器在後綴中沒有任何意義;這是一個以人爲本的公約。

但是,您還應該注意到,POSIX定義了許多以'_t'結尾的額外類型名稱,並保留了實現的後綴。這意味着如果您正在使用POSIX相關係統,則使用該約定來定義您自己的類型名稱是不明智的。我工作的系統已經完成了(超過20年);我們經常會被系統定義爲與我們定義的名稱相同的名稱。

9

它表示類型。 size_t是尺寸類型。

7

這只是一個約定,意思是「類型」。這對編譯器沒有任何特殊的意義。

37

這是用於命名數據​​類型的一個慣例,例如用typedef

 

typedef struct { 
    char* model; 
    int year; 
... 
} car_t; 
 
6

如果你處理的硬件接口代碼,你看代碼的作者可能已經定義int_t是一個特定的大小整數。 C標準不指定特定大小的int型(這取決於你的編譯器和目標平臺上,潛在的),並使用特定int_t類型將避免可移植性問題。

這是硬件接口代碼的一個特別重要的考慮因素,這可能是您爲什麼首先注意到那裏的約定的原因。

+1

這將是不太好的做法,我希望一個定義[U] int_ [32 16 8] _t弄清楚什麼是你定義的大小。 – Ilya 2008-10-24 10:56:54

+1

你說得很對,「int_t」本身告訴程序員它是用戶定義的類型,但不是它的真正含義! – 2008-10-24 19:53:34

15

它是數據類型的標準命名約定,通常由typedefs定義。許多C代碼與硬件寄存器涉及使用C99定義爲符號和無符號的固定大小的數據類型的標準名稱。作爲慣例,這些名稱位於標準頭文件(stdint.h)中,並以_t結尾。

8

_t本質上沒有任何特殊的含義。但它已經陷入普遍使用的_t後綴添加到類型定義的。

您可能更熟悉變量命名的常見C實踐...這與通常在前端粘貼指針以及在全局變量前面使用下劃線(這種方式不常見)以及將臨時變量名稱i,jk用於臨時循環變量。

在碼字,其中,大小和順序很重要,這是非常常見的是使用自定義的類型是明確的,如​​WORD(通常16位)DWORD(32位)。

int_t不太好,因爲int的定義因平臺而異 - 那麼您的int是否符合? (儘管現在大多數以PC爲中心的開發將其視爲32位,但非PC開發的很多東西仍將int視爲16位)。

6

關於這個問題有幾個很好的解釋。爲了增加重新定義類型的另一個原因:

在許多嵌入式項目中,重新定義了所有類型,以正確說明給定的類型大小,並提高跨不同平臺(即硬件類型編譯器)的可移植性。

另一個原因將使您的代碼跨不同的操作系統移植,並避免與您在代碼中集成的操作系統中現有類型的衝突。爲此,通常添加一個唯一的(儘可能)前綴。

實施例:

typedef unsigned long dc_uint32_t; 
29

_t的包裝通常由不透明類型定義。

GCC僅添加以_t結尾的名稱到您可能不使用的保留名稱空間,以避免與未來版本的標準C和POSIX (GNU C library manual)衝突。經過一番研究,我終於找到了POSIX標準內正確的引用(1003.1理(信息)):

B.2.12數據類型

在本節結束定義其他類型的要求在'_t'中是由名稱空間污染的問題提出的 。很難在一個頭文件中定義一種類型(其類型不是一個由IEEE Std 1003.1-2001定義的 ),並在另一個頭文件中使用它,而不會將符號 添加到程序的名稱空間中。爲了允許執行者提供他們自己的類型,所有 一致性應用程序都需要避免以'_t'結尾的符號,這允許實現者提供其他類型。因爲類型的主要用途是在 結構成員的定義中,因此可以(並且在許多情況下必須)將其添加到 IEEE Std 1003.1-2001中定義的結構中,因此對額外類型的需求是引人注目的。

簡而言之,標準說擴展標準類型列表的機會很大,因此標準限制了它自己使用的_t名稱空間。

例如,您的程序匹配POSIX 1003.1問題6並且您定義了類型foo_tPOSIX 1003.1問題7最終以新定義的類型foo_t發佈。您的程序與新版本不匹配,這可能是一個問題。限制_t的使用可以防止重構代碼。因此,如果你的目標是符合POSIX標準,那麼你應該避免標準所述的_t

附註:就個人而言,我試着堅持POSIX,因爲我覺得它給清潔編程好的基礎。而且,我非常喜歡Linux Coding Style (chapter 5)的指導方針。爲什麼不使用typedef有一些很好的理由。希望這個幫助!

相關問題