什么是类型跟着
这似乎是一个简单的问题,但我无法通过Stack Overflow搜索或Google找到它。 类型后跟_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年); 我们经常会被系统定义为与我们定义的名称相同的名称。
这是一个用于命名数据类型的约定,例如typedef
:
typedef struct {
char* model;
int year;
...
} car_t;
_t
通常包含一个不透明的类型定义。
GCC只是将以_t
结尾的名称添加到您可能不使用的保留名称空间中,以避免与未来版本的标准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有一些很好的理由。 希望这个帮助!
链接地址: http://www.djcxy.com/p/14017.html