【问题标题】:C Standard Conformance - IdentifiersC 标准一致性 - 标识符
【发布时间】:2014-07-15 14:10:10
【问题描述】:

我正在寻找对部分 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. 以下划线开头的所有标识符始终保留用作普通名称和标记名称中具有文件范围的标识符。

好的,我不会声明带有前导双下划线的标识符,也不会声明带有前导单下划线后跟大写字母的标识符。
但是第二条规则呢,还在考虑我上面的例子吗?

【问题讨论】:

  • “文件范围”本质上意味着“全局”,如_c99_math_isinf_f。所以基本上不要使用前导下划线。
  • @KerrekSB 非常感谢您的评论...我有点困惑,因为我认为 janneb 的回答完全有道理。有什么意见吗?
  • 好吧,仅仅声称“你是实现的一部分”有点棘手。我想这一切都归结为惯例。

标签: c standards c99 standard-library standards-compliance


【解决方案1】:

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

作为该规则的一个示例,如果您使用的是 Linux,请使用“readelf -s”来检查 glibc 或 libgcc 的符号列表。您会发现很多符号都带有前导双下划线,或前导下划线后跟大写字母。

【讨论】:

  • 我没有这样阅读标准,因此造成了混乱,但现在这实际上完全有道理......非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2011-08-25
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多