我正在寻找对C标准(C99和/或C11)部分的一些澄清,主要是关于标识符的使用。
上下文是完整的C99标准库的实现,我希望它完全符合标准。
基本问题是: C标准允许我在多大程度上宣布未在标准中列出的标识符/符号?
例如,让我们考虑来自isfinite
的{{1}}宏
可能的实现可能是:
math.h
在这里,我需要声明其他标识符,它们显然是不是C标准的。
在C99标准的第4节注释3中(一致性),我们可以阅读:
这意味着符合要求的实施不保留本国际标准中明确保留的标识符以外的标识符。
我不太明白这一点 这是否意味着我不允许声明其他标识符?
假设情况并非如此,并且我可以为自己的实现声明其他标识符,我应该遵循什么命名规则,考虑到这些标识符不是用于除了一个宏扩展,就像上面的例子一样?
在C99标准的第7.1.3节中(保留标识符),我们可以阅读:
- 所有以下划线开头且以大写字母或其他下划线开头的标识符始终保留供任何使用。
- 所有以下划线开头的标识符始终保留用作普通名称和标记名称中包含文件范围的标识符。
醇>
好的,我不会声明带有前导双下划线的标识符,也不会声明带有单个下划线后跟大写字母的标识符。
但是第二条规则呢,仍在考虑上面的例子?
答案 0 :(得分:4)
保留标识符规则的要点是那些标识符是为实现保留的。既然您正在编写(部分)实现而不是"最终用户程序",您应该在保留名称空间中命名您的标识符,这样您的标识符就不会意外地与(最终)最终用户的标识符。
作为此规则的一个示例,如果您使用的是Linux,请使用" readelf -s"检查glibc或libgcc的符号列表。您会发现许多带有前导双下划线的符号,或前导下划线后跟大写字母。