ISO 9899标准是否保留对标识符使用_t后缀?

时间:2019-07-08 13:20:28

标签: c

我可以在很多书中读到其他有关SO的问题,该标准可能扩展标识符集,例如size_tint32_t,因此它保留了对_t后缀的任何使用用于标识符。

是真的吗?

我找不到在 ISO9899:1999 标准中妨碍使用该后缀的任何内容,但是该标准很难阅读:(

3 个答案:

答案 0 :(得分:8)

不,那不是真的。

该标准保留将标识符intuint 开头并以_t结尾的标识符添加到stdint.h标头中的权利(第7.31节。 10)。从技术上讲,只有在包含该标头的情况下才保留这些标识符,但是由于几乎总是如此,因此应将它们视为保留。

通常,标准保留标识符定义在标准标头中,或在将来的说明中针对标准标头(第7.31节)提及。具有外部链接的标识符(库函数)被保留用于该用途(例如,这不会阻止您将其用作局部变量或静态变量)。如果包含库头,则保留其标识符以在文件范围内使用。有关详细信息,请阅读§7.1.3。

该部分指出,唯一无条件保留的标识符是那些以下划线开头,大写字母或第二个下划线的标识符。

在阅读标准时,了解保留名称的上下文之间的区别很重要:

  • 保留任何用途(标识符以下划线开头,后跟另一个下划线或大写字母):这些标识符可以在实现中用作宏或特殊符号,并在编译器的某些特殊方式。永远不要在您的代码中定义其中之一,而应仅使用文档中指出的内容。如果已经记录了此类符号,则不要使用它,即使您在某些标准库头文件中看到它也是如此。或其他人的代码。

  • 保留在文件范围内(其他标识符以下划线开头,而不是任何标准标头的一部分):这些标识符将不用作宏,并且您不得将其定义为宏要么。您可以将它们用作局部变量,标签,参数以及structunion成员。就个人而言,我不会这样做,但允许。我更喜欢在内部某些上下文中使用的标识符的 end 下划线。

  • 保留在文件范围,并作为宏名 included 标准标头中提及的任何标识符,包括在future Directions子句中):再次,因为这些标识符可能是宏,如果您#include关联的标头,则应将它们视为限制。该标准的确允许您#undef在标准库中用作函数名称的标识符,尽管您可能会发现性能会受到影响,因为宏将具有相同语义但优化性能的结构包装起来。

  • 保留用作具有外部链接的标识符(在任何标准库标头中定义为具有外部链接的任何标识符,无论是否包含标头,包括标识符{{1 }}:最弱的保留。如果不包括相关的标头,则只要在外部不可见,就可以自由使用此类标识符,即使在文件范围内也是如此。因此它可以是文件作用域errno或枚举成员,也可以是staticstruct的标记。此子句的目的是不允许您故意隐藏标准库函数的名称。而是要保护您免受将来添加到标准库中的影响,因为标准库可能会导出您当前正在使用的外部符号。当然,如果您当前的用途是作为外部可见的标识符,那么将来仍然会有问题。但总的来说,外部可见的符号应以软件包名称作为前缀,以避免名称与其他库冲突。


说了这么多,使用看起来像是标准标识符的标识符是不明智的。 Posix包括一个将来可能会使用的标识符名称的一百多种模式的列表,其中包括所有以union结尾的标识符,因此,如果您希望代码在Posix环境中使用,则应避免使用这些名字。而且,尽管将来的C标准修订版可能会避免在现有标头中添加新的类型名(除了上面提到的整数类型名之外),但您实际上并不想排除使用任何此类新类型,因为它们很有用。 (而且,根据@JensGustedt的评论,他比我对C工作组的工作了解得更多,在C2x的现有标头中将有几个新的类型名称。)

答案 1 :(得分:4)

标准C允许您使用angular-google-charts后缀,只要您不以以双下划线开头的令牌结尾即可。 (请注意,C ++对此进行了进一步的限制,因为令牌中的任何地方都不允许使用双下划线;如果您期望代码到达C ++,则值得坚持。)

POSIX保留_t

答案 2 :(得分:3)

ISO 9899并不保留后缀_t。将来的C11修订版库说明仅会说明(C11 7.31.10):

  
      
  1. Typedef名称​​以 intuint开头并以_t结尾的   已添加到<stdint.h>标头中定义的类型中。 [...]
  2.   

也就是说,在C11中定义了许多后缀为_t的类型:

  

char16_tchar32_tclock_tcnd_tconstraint_handler_tdiv_tdouble_terrno_tfenv_tfexcept_tfloat_tfpos_timaxdiv_t,   int_fast N _tint_least N _t,{{1} },intmax_t int N_tintptr_tldiv_tlldiv_t,{ {1}},max_align_tmbstate_tmtx_t,   ptrdiff_trsize_tsig_atomic_tsize_tthrd_start_tthrd_ttime_ttss_dtor_t tss_t uint_fastN _t uint_least,   N_t uintmax_t uintN_tuintptr_t,{{1 }},wchar_t

POSIX, on the other hand, reserves the _t suffix for system use. POSIX 1003.1基本原理摘录如下:

  

要允许实现者提供自己的类型,所有符合标准的应用程序都必须避免以wctrans_t结尾的符号,从而允许实现者提供其他类型。

总而言之,考虑到您可能希望现在或以后在POSIX系统中使用C代码,从而避免对自己的类型使用wctype_t