这似乎是一个简单的问题,但是在Stack Overflow搜索或Google中找不到。 _t后跟的类型是什么意思?例如,

int_t anInt;


我在C语言中看到了很多与硬件紧密相关的内容,我不禁认为它们是相关的。 >

评论

int_t在哪里定义?如果始终将其定义为int,则它没有用;直接使用int更清楚。如果不总是将其定义为int(例如,如果它可能是long int或short int),则它是一个选择不当且令人困惑的名称。

#1 楼

正如道格拉斯·梅尔(Douglas Mayle)所指出的,它基本上表示类型名称。因此,建议您不要以'_t'结尾变量或函数名,因为这可能会引起一些混乱。除了size_t之外,C89标准还定义了wchar_toff_tptrdiff_t,还有可能我忘了一些其他内容。 C99标准定义了许多其他类型,例如uintptr_tintmax_tint8_tuint_least16_tuint_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中已成为一种普遍使用的方法。在前端使用指针,并在全局变量之前使用下划线(这不太常见),并对临时循环变量使用变量名称ijk。在代码大小和排序很重要的代码中,通常使用显式的自定义定义类型,例如BYTEWORD(通常为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

#10 楼

例如,在C99中,/ usr / include / stdint.h: