Kev*_*fin 240 c types naming-conventions
这似乎是一个简单的问题,但我无法通过Stack Overflow搜索或Google找到它.什么类型后跟一个_t意思?如
int_t anInt;
我在C代码中看到很多意味着与硬件紧密相关 - 我不禁认为它们是相关的.
Jon*_*ler 196
正如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年); 我们经常会被定义与我们定义的名称相同的类型的系统绊倒.
mma*_*lay 46
它是用于命名数据类型的约定,例如typedef:
typedef struct {
  char* model;
  int year;
...
} car_t;
        Ben*_*oit 38
在_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中定义的结构中,因此对其他类型的需求是引人注目的.
简而言之,标准表示很有可能扩展标准类型列表,因此标准限制_t命名空间供自己使用.
例如,您的程序与POSIX 1003.1问题6匹配,并且您定义了一种类型foo_t.POSIX 1003.1问题7最终以新定义的类型发布foo_t.您的程序与新版本不匹配,这可能是一个问题.限制_t使用会阻止重构代码.因此,如果您的目标是POSIX合规性,那么您应该完全避免_t标准所说的那样.
旁注:就个人而言,我尝试坚持POSIX,因为我认为它为清洁编程提供了良好的基础知识.此外,我非常喜欢Linux编码风格(第5章)指南.为什么不使用typedef有一些很好的理由.希望这有帮助!
mkC*_*ark 18
它是数据类型的标准命名约定,通常由typedef定义.许多处理硬件寄存器的C代码使用C99定义的标准名称来表示有符号和无符号固定大小的数据类型.作为惯例,这些名称位于标准头文件(stdint.h)中,以_t结尾.
Toy*_*der 11
在_t并不具有任何特殊含义.但是将_t后缀添加到typedef中已经很常见了.
您可能更熟悉变量命名的常见C实践...这类似于在前面为指针粘贴ap并在全局变量前面使用下划线(这有点不常见)的常见方法,并使用变量名i,j以及k临时循环变量.
在字大小和排序很重要的代码中,使用显式的自定义类型非常常见,例如BYTE WORD(通常是16位)DWORD(32位).  
int_t是不是很好,因为int平台之间的定义各不相同 - 所以int你遵守哪些?(尽管如今,大多数以PC为中心的开发都将其视为32位,非PC开发的大部分内容仍将int视为16位).  
关于这个问题有一些很好的解释.只是为了添加另一个重新定义类型的原因:
在许多嵌入式项目中,所有类型都被重新定义,以正确地说明给定类型的大小,并提高跨不同平台(即硬件类型编译器)的可移植性.
另一个原因是使您的代码可以跨不同的操作系统移植,并避免与您在代码中集成的操作系统中的现有类型发生冲突.为此,通常添加唯一(尽可能)的前缀.
例:
typedef unsigned long dc_uint32_t;
如果您正在处理硬件接口代码,那么您正在查看的代码的作者可能已定义int_t为特定大小的整数.C标准没有为int类型指定特定大小(可能取决于您的编译器和目标平台),并且使用特定int_t类型将避免该可移植性问题.
这是硬件接口代码特别重要的考虑因素,这可能是您第一次注意到那里的约定的原因.