我可以在许多书籍和其他有关SO的问题中读到,该标准可能会扩展标识符集,例如size_t或int32_t,因此它保留了_t对标识符后缀的任何使用。
真的吗?
我找不到在ISO9899:1999标准中妨碍使用此后缀的任何内容,但该标准很难阅读:(
不,那不是真的。
该标准保留添加以标头开头int或uint结尾(第7.3.1.10节)的标识符的权利。从技术上讲,仅在包含该标头的情况下才保留这些标识符,但由于几乎总是如此,因此应将其视为保留。_tstdint.h
通常,标准保留标识符定义在标准标头中,或在将来的说明中针对标准标头(第7.31节)提及。具有外部链接的标识符(库函数)被保留用于该用途(例如,这不会阻止您将其用作局部变量或静态变量)。如果包含库头,则保留其标识符以在文件范围内使用。有关详细信息,请阅读第7.1.3节。
如该部分所示,唯一无条件保留的标识符是那些以下划线开头,大写字母或第二个下划线开头的标识符。
阅读标准时,了解保留名称的上下文之间的区别很重要:
保留用于任何用途(以下划线开头的标识符,然后是另一个下划线或大写字母的标识符):这些标识符可被实现方式用作宏或特殊符号,由编译器以某种特殊方式对其进行处理。永远不要在您的代码中定义其中之一,而应仅使用文档中指出的内容。如果已经记录了此类符号,则不要使用它,即使您在某些标准库头文件中看到它也是如此。或其他人的代码。
在文件范围内保留(其他标识符以下划线开头,而不是任何标准标头的一部分):这些标识符将不用作宏,并且也不能将其定义为宏。您可以将它们用作局部变量,标签,参数和struct或union成员。就个人而言,我不会这样做,但是是允许的。我更喜欢在某些内部上下文中使用的标识符的末尾加上下划线。
在文件范围保留并作为宏名称(在提及的任何标识符包含标准报头,包括未来方向子句中):同样,由于这些标识符可以是宏,则应该将它们视为断开,如果你限制#include相关联的报头。该标准的确允许您#undef在标准库中用作函数名称的标识符,尽管您可能会发现性能会受到影响,因为宏使用等效语义包装了结构,但性能得到了优化。
保留以用作具有外部链接的标识符(在任何标准库头文件中定义为具有外部链接的任何标识符,无论是否包括头文件,包括标识符errno):最弱的保留。如果不包括相关的标头,则即使在文件范围内也可以自由使用此类标识符,只要它在外部不可见即可。因此,它可能是一个文件范围static或枚举成员或的标签struct或union。此子句的目的是不允许您故意隐藏标准库函数的名称。而是要保护您免受将来添加到标准库中的影响,因为标准库可能会导出您当前正在使用的外部符号。当然,如果您当前的用途是作为外部可见的标识符,那么将来仍然会有问题。但总的来说,外部可见的符号应以软件包名称作为前缀,以避免名称与其他库冲突。
说了这么多,使用看起来像是标准标识符的标识符是不明智的。Posix包括了将来可能会使用的一百多种标识符名称的列表,包括所有以结尾的标识符_t,因此,如果您希望代码在Posix环境中使用,则将避免使用这些名称。尽管将来的C标准修订版可能会避免向现有标头中添加新的类型名(除了上面提到的整数类型名),但您实际上并不希望排除使用任何此类新类型,因为它们可能很有用。(而且,根据@JensGustedt的评论,他比我对C工作组的工作了解得更多,在C2x的现有标头中将有几个新的类型名称。)
_tISO 9899 本身并未保留该后缀。C11 修订版的未来库方向仅说明(C11 7.31.10):
\n\n\n\n
\n- 以
\nintor开头uint并以 结尾的Typedef 名称_t可以添加到<stdint.h>标头中定义的类型中。\xc2\xa0[...]
也就是说,_tC11 中定义了很多带有后缀的类型:
\n\n\n\n
char16_t,char32_t,clock_t,cnd_t,constraint_handler_t,div_t,double_t,errno_t, ,fenv_t,fexcept_t,float_t,fpos_t,imaxdiv_t\n , , , , , , , , , , , , \ n , , , , , , , , , \n , , , , , ,int_fastN_tint_leastN_tintmax_tintN_tintptr_tldiv_tlldiv_tmax_align_tmbstate_tmtx_tptrdiff_trsize_tsig_atomic_tsize_tthrd_start_tthrd_ttime_ttss_dtor_ttss_tuint_fastN_tuint_leastN_tuintmax_tuintN_tuintptr_twchar_twctrans_twctype_twint_t
另一方面,POSIX保留后缀_t供系统使用。POSIX 1003.1 基本原理摘录如下:
\n\n\n为了允许实现者提供自己的类型,所有符合要求的应用程序都需要避免以 结尾的符号
\n_t,这允许实现者提供其他类型。
总而言之,考虑到您现在或以后有可能希望在 POSIX 系统中使用 C 代码,从而避免使用_t您自己的类型。
标准 C 允许您使用_t后缀,只要您不以双下划线开头的标记结束即可。(请注意,C++ 进一步限制了这一点,因为令牌中的任何位置都不允许使用双下划线;如果您预期代码会达到 C++,则值得遵守。)
是 POSIX 保留的_t。