這似乎是一個簡單的問題,但我不能與堆棧溢出搜索或谷歌找到它。 _t
是什麼意思?如類型後跟_t(下劃線-t)代表什麼?
int_t anInt;
我看到了很多在C代碼爲了與關係密切的硬件我不禁想,他們是相關的。
這似乎是一個簡單的問題,但我不能與堆棧溢出搜索或谷歌找到它。 _t
是什麼意思?如類型後跟_t(下劃線-t)代表什麼?
int_t anInt;
我看到了很多在C代碼爲了與關係密切的硬件我不禁想,他們是相關的。
正如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年);我們經常會被系統定義爲與我們定義的名稱相同的名稱。
它表示類型。 size_t
是尺寸類型。
這只是一個約定,意思是「類型」。這對編譯器沒有任何特殊的意義。
這是用於命名數據類型的一個慣例,例如用typedef
:
typedef struct {
char* model;
int year;
...
} car_t;
如果你處理的硬件接口代碼,你看代碼的作者可能已經定義int_t
是一個特定的大小整數。 C標準不指定特定大小的int
型(這取決於你的編譯器和目標平臺上,潛在的),並使用特定int_t
類型將避免可移植性問題。
這是硬件接口代碼的一個特別重要的考慮因素,這可能是您爲什麼首先注意到那裏的約定的原因。
這將是不太好的做法,我希望一個定義[U] int_ [32 16 8] _t弄清楚什麼是你定義的大小。 – Ilya 2008-10-24 10:56:54
你說得很對,「int_t」本身告訴程序員它是用戶定義的類型,但不是它的真正含義! – 2008-10-24 19:53:34
它是數據類型的標準命名約定,通常由typedefs定義。許多C代碼與硬件寄存器涉及使用C99定義爲符號和無符號的固定大小的數據類型的標準名稱。作爲慣例,這些名稱位於標準頭文件(stdint.h)中,並以_t結尾。
_t
本質上沒有任何特殊的含義。但它已經陷入普遍使用的_t
後綴添加到類型定義的。
您可能更熟悉變量命名的常見C實踐...這與通常在前端粘貼指針以及在全局變量前面使用下劃線(這種方式不常見)以及將臨時變量名稱i
,j
和k
用於臨時循環變量。
在碼字,其中,大小和順序很重要,這是非常常見的是使用自定義的類型是明確的,如WORD
(通常16位)DWORD
(32位)。
int_t
不太好,因爲int
的定義因平臺而異 - 那麼您的int
是否符合? (儘管現在大多數以PC爲中心的開發將其視爲32位,但非PC開發的很多東西仍將int視爲16位)。
關於這個問題有幾個很好的解釋。爲了增加重新定義類型的另一個原因:
在許多嵌入式項目中,重新定義了所有類型,以正確說明給定的類型大小,並提高跨不同平臺(即硬件類型編譯器)的可移植性。
另一個原因將使您的代碼跨不同的操作系統移植,並避免與您在代碼中集成的操作系統中現有類型的衝突。爲此,通常添加一個唯一的(儘可能)前綴。
實施例:
typedef unsigned long dc_uint32_t;
_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_t
。 POSIX 1003.1問題7最終以新定義的類型foo_t
發佈。您的程序與新版本不匹配,這可能是一個問題。限制_t
的使用可以防止重構代碼。因此,如果你的目標是符合POSIX標準,那麼你應該避免標準所述的_t
。
附註:就個人而言,我試着堅持POSIX,因爲我覺得它給清潔編程好的基礎。而且,我非常喜歡Linux Coding Style (chapter 5)的指導方針。爲什麼不使用typedef有一些很好的理由。希望這個幫助!
凡`int_t`定義?如果它總是被定義爲`int`,那麼它沒有用;直接使用`int`會更清晰。如果它不總是被定義爲「int」(比如說,它可能是`long int`或`short int`),那麼這是一個選擇不好並且令人困惑的名字。 – 2015-07-24 17:32:58