`char _3 ='c'`在C和C++中有效吗?

msc*_*msc -2 c c++ variables identifier

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

#include <stdio.h>

int main()
{
   char _3 = 'c';
   printf("%c\n",_3);
}
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*nes 8

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

然而,我不建议使用具有这种名称的变量,因为它可能会让读者感到困惑.

从C++ 2003标准:

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

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

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

165)这些名称也在namespace :: std(17.4.3.1)中保留.


Sto*_*ica 5

它在除全局范围1之外的任何范围内都有效.

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

此外,一些标识符保留供C++实现使用,否则不得使用; 无需诊断.

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

标准库实际上在命名空间作用域中有一个示例,继承自boost:占位符std::bind.

和C有类似的措辞:

C11 - n1570/7.1.3保留标识符

每个标头声明或定义其关联子条款中列出的所有标识符,并可选地声明或定义其关联的未来库方向子条款和标识符中列出的标识符,这些标识符始终保留用于任何用途或用作文件范围标识符.

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

虽然范围的选择更加有限.


1 - 不是规范性术语,只是对两个标准所用术语的混淆.