C ISO 9899标准是否为标识符保留了任何后缀?

C ISO 9899标准是否为标识符保留了任何后缀?,c,C,我可以阅读许多书籍和其他一些问题,因此标准可能会扩展标识符集,如size\u t或int32\u t,因此它保留对标识符使用\u t后缀 这是真的吗 在ISO9899:1999标准中,我找不到任何不鼓励使用此后缀的东西,但该标准很难理解:(标准C允许您使用\t后缀,只要您不使用以双下划线开头的标记。(注意C++进一步限制了这一点,因为令牌中的任何地方都不允许有双下划线;如果你希望代码达到C++,就值得坚持) 是POSIX保留了\t不,这不是真的 本标准保留在stdint.h标题(§7.31.10

我可以阅读许多书籍和其他一些问题,因此标准可能会扩展标识符集,如
size\u t
int32\u t
,因此它保留对标识符使用
\u t
后缀

这是真的吗


ISO9899:1999标准中,我找不到任何不鼓励使用此后缀的东西,但该标准很难理解:(

标准C允许您使用
\t
后缀,只要您不使用以双下划线开头的标记。(注意C++进一步限制了这一点,因为令牌中的任何地方都不允许有双下划线;如果你希望代码达到C++,就值得坚持)

是POSIX保留了
\t

不,这不是真的

本标准保留在
stdint.h
标题(§7.31.10)中添加以
int
uint
开头,以
\u t
结尾的标识符的权利。这些标识符仅在包含该标题的情况下在技术上是保留的,但由于几乎总是这样,因此应将其视为保留的

通常,标准会保留标准标题中定义的标识符,或标准标题的未来方向(§7.31)中提到的标识符。具有外部链接(库函数)的标识符将保留供该用途(例如,这不会阻止您将其用作局部或静态变量)。如果包含库头,则其标识符保留用于文件范围。有关详细信息,请阅读§7.1.3

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

阅读本标准时,了解保留名称的上下文之间的差异非常重要:

  • 保留供任何使用(标识符以下划线开头,后跟另一个下划线或大写字母):这些标识符可能被实现用作宏或特殊符号,由编译器以某种特殊方式处理。永远不要在代码中定义这些标识符中的一个,而只使用文档中指示的标识符。如果没有文档,不要使用这样的符号,即使您看到它在某些代码中使用标准库标题。或其他人的代码

  • 在文件范围内保留(以下划线开头的其他标识符,而不是任何标准头的一部分):这些标识符不会用作宏,您也不能将它们定义为宏。您可以将它们用作局部变量、标签、参数和
    struct
    union
    成员。就个人而言,我不会这样做,但这是允许的。我更喜欢在某些内部c语言中使用的标识符末尾加下划线内容

  • 保留在文件范围内并作为宏名称(包含在标准头中的任何标识符,包括在future directions子句中):同样,由于这些标识符可能是宏,如果您
    #包含关联的头,则应将它们视为禁止使用的。标准允许您
    #取消定义
    在标准库中用作函数名的标识符,尽管您可能会发现性能受到影响,因为宏使用等效的这不是语义,而是优化了性能

  • 保留用作具有外部链接的标识符(任何标准库标题中定义为具有外部链接的任何标识符,无论是否包含标题,包括标识符
    errno
    ):最薄弱的保留。如果不包括关联的标头,则可以自由使用此类标识符,即使在文件范围内,只要它在外部不可见。因此,它可以是文件范围
    静态
    或枚举成员或
    结构
    联合
    的标记。本子句的要点是不允许您o故意隐藏标准库函数的名称。相反,这是为了防止将来添加到标准库中,从而导出当前使用的外部符号。当然,如果当前使用的是外部可见标识符,则将来仍会有问题。但总体而言,外部可见ble符号应以包名称作为前缀,以避免与其他库发生名称冲突



话虽如此,使用一个看起来可能是标准标识符的标识符是不明智的。Posix包含了一个列表,其中包含了未来可能使用的上百种标识符名称模式,包括所有以
\u t
结尾的标识符,因此如果您希望您的代码在Posix环境中使用,您应该避免使用这些模式虽然未来的C标准修订版可能会避免在现有的标题中添加新的类型名(除了上面提到的整数类型名),但您并不想排除使用任何此类新类型,因为它们可能很有用。(而且,根据@JensGustedt的评论,@JensGustedt比我更了解C工作组的工作,在C2x中现有的头中会有两个新的类型名称。)

ISO 9899并没有保留
\t
后缀。C11修订版的未来库方向只说():

  • int
    uint
    开头并以
    \u t
    结尾的Typedef名称可以是 添加到
    标题中定义的类型。[…]
  • 也就是说,C11中定义了许多带有
    \u t
    后缀的类型:

    char16\u t
    char32\u t
    clock\u t
    cnd\u t
    constraint\u handler\u t
    div\u t
    double\u t
    fev\u t
    feexcept\t
    浮动