繁体   English   中英

C标准符合性-标识符

[英]C Standard Conformance - Identifiers

我正在寻找一些有关C标准(C99和/或C11)的说明,主要是关于标识符的使用。
上下文是完整C99标准库的实现,我希望它完全符合该标准。

基本问题是: C标准允许我在多大程度上声明未在标准中列出的标识符/符号?

例如,让我们考虑math.hisfinite宏。
可能的实现方式可能是:

#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 );

在这里,我需要声明显然不属于 C标准的其他标识符

在C99标准( 一致性第4部分的注释3中,我们可以阅读:

这意味着除本国际标准中明确保留的标识符外,符合标准的实现不保留任何标识符。

我不确定是否了解。
这是否意味着我不允许声明其他标识符?

假设情况并非如此,并且允许我为自己的实现声明其他标识符,那么我应该遵循什么命名规则 ,考虑到这些标识符除了上面的示例中的宏扩展之外,不打算使用?

在C99标准的7.1.3节预留标识符 )中,我们可以阅读:

  1. 以下划线,大写字母或另一个下划线开头的所有标识符始终保留供任何使用。
  2. 始终保留所有以下划线开头的标识符,以用作普通名称和标记名称中具有文件范围的标识符。

好的,我不会声明带有双引号和双引号的标识符,也不能带单引号和大写字母。
但是第二条规则又如何考虑我上面的示例呢?

保留标识符规则的重点是为实施保留了这些标识符。 现在,您正在编写实现的一部分(而不是“最终用户程序”),您应该在保留的名称空间中命名标识符,以确保标识符不会意外地与(最终)端的标识符发生冲突。用户。

作为运行中该规则的示例,如果您使用的是Linux,请使用“ readelf -s”检查glibc或libgcc的符号列表。 您会发现大量带有双下划线的符号,或带下划线的大写字母。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM