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
成员。就个人而言,我不会这样做,但这是允许的。我更喜欢在某些内部c语言中使用的标识符末尾加下划线内容union
- 保留在文件范围内并作为宏名称(包含在标准头中的任何标识符,包括在future directions子句中):同样,由于这些标识符可能是宏,如果您
#包含关联的头,则应将它们视为禁止使用的。标准允许您
在标准库中用作函数名的标识符,尽管您可能会发现性能受到影响,因为宏使用等效的这不是语义,而是优化了性能#取消定义
- 保留用作具有外部链接的标识符(任何标准库标题中定义为具有外部链接的任何标识符,无论是否包含标题,包括标识符
):最薄弱的保留。如果不包括关联的标头,则可以自由使用此类标识符,即使在文件范围内,只要它在外部不可见。因此,它可以是文件范围errno
或枚举成员或静态
结构
或
的标记。本子句的要点是不允许您o故意隐藏标准库函数的名称。相反,这是为了防止将来添加到标准库中,从而导出当前使用的外部符号。当然,如果当前使用的是外部可见标识符,则将来仍会有问题。但总体而言,外部可见ble符号应以包名称作为前缀,以避免与其他库发生名称冲突联合
话虽如此,使用一个看起来可能是标准标识符的标识符是不明智的。Posix包含了一个列表,其中包含了未来可能使用的上百种标识符名称模式,包括所有以
\u t
结尾的标识符,因此如果您希望您的代码在Posix环境中使用,您应该避免使用这些模式虽然未来的C标准修订版可能会避免在现有的标题中添加新的类型名(除了上面提到的整数类型名),但您并不想排除使用任何此类新类型,因为它们可能很有用。(而且,根据@JensGustedt的评论,@JensGustedt比我更了解C工作组的工作,在C2x中现有的头中会有两个新的类型名称。)ISO 9899并没有保留\t
后缀。C11修订版的未来库方向只说():
int
或uint
开头并以\u t
结尾的Typedef名称可以是
添加到
标题中定义的类型。[…]\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
,浮动