Mac*_*ade 2 c standards standards-compliance c99 standard-library
我正在寻找关于 C 标准(C99 和/或 C11)部分的一些说明,主要是关于identifiers的使用。
上下文是一个完整的 C99 标准库的实现,我希望它完全符合标准。
基本问题是:C 标准允许我在多大程度上声明标准中未列出的标识符/符号?
例如,让我们考虑isfinite来自math.h.
一个可能的实现可能是:
#define isinf( _x_ ) \
( \
( sizeof( _x_ ) == sizeof( float ) ) ? _c99_math_isinf_f( _x_ ) : \
( sizeof( _x_ ) == sizeof( double ) ) ? _c99_math_isinf_d( _x_ ) : \
_c99_math_isinf_l( _x_ ) \
)
int _c99_math_isinf_f( float x );
int _c99_math_isinf_d( double x );
int _c99_math_isinf_l( long double x );
Run Code Online (Sandbox Code Playgroud)
在这里,我需要声明显然不属于C 标准的其他标识符。
在C99 标准(一致性)第 4 节的注释 3 中,我们可以阅读:
这意味着除了在本国际标准中明确保留的标识符之外,符合标准的实现不保留其他标识符。
我不确定是否理解。
这是否意味着我不能声明额外的标识符?
假设情况并非如此,并且允许我为自己的实现声明其他标识符,那么我应该遵循什么命名规则,考虑到这些标识符不打算用于宏扩展之外,就像上面的例子一样?
在C99 标准的第 7.1.3 节(保留标识符)中,我们可以阅读:
- 所有以下划线和大写字母或另一个下划线开头的标识符始终保留供任何使用。
- 所有以下划线开头的标识符始终保留用作普通名称和标记名称中具有文件范围的标识符。
好的,我不会声明带有前导双下划线的标识符,也不会声明前导单下划线后跟大写字母。
但是第二条规则呢,仍然考虑我上面的例子?
保留标识符规则的要点是这些标识符是为实现保留的。现在您正在编写(部分)实现而不是“最终用户程序”,您应该在保留的名称空间中命名您的标识符,以便您的标识符不会意外地与(最终)结束的标识符冲突用户。
作为此规则实际应用的示例,如果您使用的是 Linux,请使用“readelf -s”来检查 glibc 或 libgcc 的符号列表。您会发现许多带有前导双下划线或前导下划线后跟大写字母的符号。
| 归档时间: |
|
| 查看次数: |
239 次 |
| 最近记录: |