_t
后跟的类型是什么意思?例如,int_t anInt;
我在C语言中看到了很多与硬件紧密相关的内容,我不禁认为它们是相关的。 >
#1 楼
正如道格拉斯·梅尔(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年);我们经常会被系统定义类型与我们定义的名称相同的系统绊倒。评论
OS和通用运行时库用通用名称定义类型似乎是合理的;但您公司的类型是否也应该不带前缀或其他前缀?
–玩具制造商
08-10-23在22:38
为了避免这种情况,我在typedef上使用_type而不是_t。
– CesarB
08-10-23在23:51
@Jonathan Leffler-用户定义类型将使用什么命名约定?
– J. Andrew Laughlin
11年4月18日在21:43
@Andrew:如果您可以方便地使用缩写作为前缀,则可以安全地使用abbr_xxxxx_t类型名称。没有这样的前缀,您可能会随时被抓。通常,标准化的_t类型使用所有小写字母(FILE和DIR是两个例外,两次都是-大写,并且不包含_t),因此您可以使用具有中等安全性的CamelCase_t(带或不带大写字母)。我主要工作的系统无论如何都会危险地生活并且仍然使用_t,但是有时它会咬我们。我倾向于使用不带后缀的CamelCase进行自己的工作。我的函数通常都是小写的。
–乔纳森·莱弗勒(Jonathan Leffler)
2011年4月18日在22:45
@JonathanLeffler,我开始使用该约定,CamelCase用于类型,lower_case用于函数。我搜寻了这个问题,希望我不是唯一的一个。感谢您的验证!
–奥斯汀·穆林斯
14年6月13日在22:26
#2 楼
这是用于命名数据类型的约定,例如typedef
:
typedef struct {
char* model;
int year;
...
} car_t;
评论
请勿将_t后缀用于您自己的类型,因为它们在某些标准中已保留,因此最好使用_T。同样,永远不要typedef一个匿名结构,向前声明这个结构将变得不可能。给该结构命名或根本不使用typedef。
– 12431234123412341234123
9月7日9:40
#3 楼
_t
通常包装不透明的类型定义。GCC只会将以
_t
结尾的名称添加到您可能不使用的保留名称空间中,以避免与将来的Standard C和POSIX版本冲突(GNU C库手册)。经过一番研究,我终于在POSIX标准(1003.1,基本原理(信息性))中找到了正确的参考:B.2.12数据类型需求
名称空间污染问题提示了本节中定义的其他类型以“ _t”结尾。很难在一个头文件中定义类型(该类型不是IEEE Std 1003.1-2001定义的一个),而又不向程序的名称空间添加符号
而在另一个头文件中使用它。为了允许实现者提供自己的类型,所有符合
要求的应用程序都必须避免以“ _t”结尾的符号,从而允许实现者提供其他类型。由于类型的主要用途是
结构成员的定义,可以(并且在许多情况下必须)将其添加到
IEEE Std 1003.1-2001中定义的结构中,因此需要其他类型
简而言之,Standard表示有很好的机会扩展Standard类型的列表,因此Standard限制了
_t
命名空间供其自己使用。例如,您的程序匹配POSIX 1003.1第6版,并且您定义了类型
foo_t
。 POSIX 1003.1第7期最终以新定义的类型foo_t
发行。您的程序与新版本不匹配,这可能是一个问题。限制_t
的使用可以防止重构代码。因此,如果您希望符合POSIX标准,则绝对应避免使用标准规定的_t
。旁注:就我个人而言,我尝试坚持使用POSIX,因为我认为它为简洁编程提供了良好的基础。而且,我非常喜欢Linux Coding Style(第5章)指南。有一些很好的理由为什么不使用typedef。希望能有所帮助!
#4 楼
它是数据类型的标准命名约定,通常由typedef定义。许多处理硬件寄存器的C代码将C99定义的标准名称用于有符号和无符号固定大小数据类型。按照惯例,这些名称位于标准头文件(stdint.h)中,并以_t结尾。#5 楼
这只是一个约定,意为“类型”。这对编译器没有什么特别的意义。#6 楼
这意味着类型。size_t
是尺寸类型。#7 楼
_t
本质上没有任何特殊含义。但是,将_t
后缀添加到typedef中已成为一种普遍使用的方法。在前端使用指针,并在全局变量之前使用下划线(这不太常见),并对临时循环变量使用变量名称i
,j
和k
。在代码大小和排序很重要的代码中,通常使用显式的自定义定义类型,例如BYTE
,WORD
(通常为16位),DWORD
(32位)。 int_t
不太好,因为int
的定义因平台而异-那么您符合谁的int
? (尽管现在,大多数以PC为中心的开发将其视为32位,但许多非PC开发人员仍将int视为16位)。 #8 楼
关于这个问题有一些很好的解释。只是增加了重新定义类型的另一个原因:在许多嵌入式项目中,所有类型都被重新定义以正确地给定类型的给定大小,并改善跨不同平台的可移植性(即硬件类型编译器) )。
另一个原因是使您的代码可跨不同的操作系统移植,并避免与代码中集成的操作系统中的现有类型发生冲突。为此,通常添加一个唯一的(尽可能)前缀。
示例:
typedef unsigned long dc_uint32_t;
#9 楼
如果您要处理的是硬件接口代码,那么正在查看代码的作者可能已将int_t
定义为特定大小的整数。 C标准不会为int
类型分配特定的大小(可能取决于您的编译器和目标平台),并且使用特定的int_t
类型可以避免该可移植性问题。对硬件接口代码特别重要的考虑因素,这也许就是为什么您首先注意到那里的约定的原因。
评论
这不是一个很好的做法,我希望可以定义[u] int_ [32 16 8] _t来明确您定义的大小。
–伊利亚
08-10-24在10:56
您说得很对,“ int_t”本身告诉程序员这是用户定义的类型,但实际上不是!
– Greg Hewgill
08-10-24在19:53
评论
int_t在哪里定义?如果始终将其定义为int,则它没有用;直接使用int更清楚。如果不总是将其定义为int(例如,如果它可能是long int或short int),则它是一个选择不当且令人困惑的名称。