【问题标题】:Is `char _3 = 'c'` valid in C and C++? [duplicate]`char _3 = 'c'` 在 C 和 C++ 中有效吗? [复制]
【发布时间】:2018-04-17 15:33:28
【问题描述】:

考虑到,我已将变量名声明为带下划线的数字。

#include <stdio.h>

int main()
{
   char _3 = 'c';
   printf("%c\n",_3);
}

我想知道,它在 C 和 C++ 中运行良好。那么,它有效吗?

【问题讨论】:

  • 可以编译吗?
  • @alk 是的,它编译得很好。
  • 这是合法的,但你为什么要这样做?这是一个无用的变量名称。
  • 我对此表示反对,因为它没有显示任何研究工作。搜索“C 有效变量名”给出了答案。
  • @Peter - 此特定代码没有 UB。名称隐藏和解析保证了这一点。

标签: c++ c variables identifier


【解决方案1】:

所有变量名必须以字母开头或 下划线。所以是的,它是有效的,除非你把它放在文件范围内。 (注意双下划线,它是为编译器内部使用而保留的)

然而,我不建议使用这样名称的变量,因为这可能会让读者感到困惑。

来自 C++ 2003 标准:

17.4.3.1.2 全局名称 [lib.global.names]

某些名称和函数签名始终保留给实现:

  • 每个包含双下划线 (_ _) 或以下划线后跟大写字母 (2.11) 的名称都保留给实现以供任何使用。
  • 以下划线开头的每个名称都保留给实现,用作全局命名空间中的名称。165

165) 此类名称也保留在命名空间 ::std (17.4.3.1) 中。

【讨论】:

    【解决方案2】:

    在全局范围以外的任何范围内都有效1

    C++17 - n4659 / [lex.name]

    另外,有些标识符是保留给 C++ 使用的 实现,不得以其他方式使用;没有诊断是 必填。

    • 每个以下划线开头的标识符都保留给实现,用作全局命名空间中的名称

    标准库实际上在命名空间范围内有一个示例,继承自booststd::bind 的占位符。

    C 也有类似的措辞:

    C11 - n1570 / 7.1.3 Reserved identifiers

    每个标头声明或定义其列于其中的所有标识符 相关的子条款,并且可选地声明或定义标识符 在其相关的未来图书馆方向子条款中列出和 始终保留用于任何用途或用作 文件范围标识符。

    • 以下划线开头的所有标识符始终保留用作普通和标记中具有文件范围的标识符 命名空间。

    虽然范围的选择比较有限。


    1 - 不是规范术语,只是两个标准使用的术语的混蛋。

    【讨论】:

    • _c 不在全局命名空间中。
    • @Olaf - _c?不确定我是否关注你
    • 无论在 C++ 中是什么,C 都没有像标准节目中的 sn-p 那样的“全局名称空间”。 _c 在这里是函数/块范围。对于 C++,它是类似的,只是措辞更笼统。
    • @Olaf - 我明确区分了两个引号,并明确标记了这个混蛋术语。所以我真的不知道你指的是什么问题
    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多