【问题标题】:Is it permissible for global, static identifiers to begin with a single _?全局静态标识符是否允许以单个 _ 开头?
【发布时间】:2016-08-17 13:22:09
【问题描述】:

换句话说,static(=file-scoped)全局变量是否可以正好以一个下划线开头,而不会产生与 C 实现发生名称冲突的可能性?

https://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html 说“...保留名称包括所有以下划线 ('_') 开头的外部标识符(全局函数和变量)...”(强调我的)。

我注意到 Linux 内核启动的函数可能不应该用双下划线直接调用。

我发现这个概念很有用,我发现_(_)something 在区分“私有”标识符时比something_ 更容易阅读,但我理解 (?) 双下划线邀请名称与 C 实现发生冲突。

全局、静态 _variables_functions 安全吗?

【问题讨论】:

  • 谷歌“C11 草稿”然后检查 7.1.3。 C 标准和 POSIX 不一定一致。

标签: c


【解决方案1】:

标准保留带有下划线1的前缀。


1(引自:ISO/IEC 9899:201x 7.1.3 保留标识符 1)
以下划线和大写字母或其他字母开头的所有标识符 下划线始终保留用于任何用途。
所有以下划线开头的标识符始终保留用作标识符 在普通名称空间和标记名称空间中都具有文件范围。

【讨论】:

  • 9899:201x 应该是什么意思?为什么不是 2011 年?
  • 我不确定你指的是不是很奇怪的东西,比如 INCITS/ISO 9899-2012... 这是相同的 C11 标准。引用草稿时,您可能应该使用草稿名称 N1570 或类似名称。无论如何,我有官方的 ISO 2011 标准,它在所有重要方面都与草案相同。因此,即使您只有草稿,也可以放心参考 9899:2011。
【解决方案2】:

这不安全。根据架构,您的代码甚至可能需要对 static 对象进行一些重定位。因此,它们的名称必须对链接器以及 CRT 符号的名称可见。这可能会导致冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2013-05-05
    • 2017-04-01
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多