C++11 允许在标识符中使用美元符号吗?

问题描述 投票:0回答:3

C++03 中的标识符中允许使用美元符号吗? 涵盖了 C++03 中不允许在标识符中使用美元符号。 GCC 将其作为C 扩展提供,并在 C++03 模式下正确给出诊断。但是,在 C++11 中,

int $ = 0
将在没有警告的情况下进行编译。

这个 answer 是允许

$
的原因,因为实现定义的标识符不需要诊断:

这里的答案是“也许”:根据§2.11,标识符 可能由 digitsidentifier-nondigits 组成,从 1 开始 后者。 非数字标识符是常见的

a-z
A-Z
和 下划线,此外,自 C++11 起,它们还包括 通用字符名称(例如
\uBEAF
\UC0FFEE32
)、和其他实现定义的字符。所以它是实现定义的 如果允许在标识符中使用
$
。 VC10及以上版本支持, 也许早期版本也是如此。它甚至支持像这样的标识符
こんばんわ

但是:我不会使用它们。使标识符尽可能具有可读性和可移植性。

$
是实现定义的,因此不是 便携式。

这种语言也存在于 C++03 标准中,所以我认为这不是一个非常有说服力的论点。

§2.10/2

另外,一些标识符是保留给C++使用的 实现和标准库(17.6.4.3.2)并且不应 以其他方式使用;无需诊断。

标准中的哪些变化允许

$
用作标识符名称?

c++ c++11 language-lawyer identifier
3个回答
25
投票

这是实现定义的行为,

$
不包含在标识符的语法中。 C++11中标识符名称的规则是:

  1. 不能以数字开头
  2. 可以由字母、数字、下划线、通用字符名称和实现定义字符组成
  3. 不能是关键字

实现定义的字符是允许的,并且许多编译器都支持作为扩展,包括gcc

clang
Visual Studio以及如注释中所述,显然是DEC C++编译器

语法包含在C++标准草案部分

2.11
标识符,我添加了以
<-
开头的附加注释:

identifier:
  identifier-nondigit            <- Can only start with a non-digit
  identifier identifier-nondigit <- Next two rules allows for subsequent 
  identifier digit               <-  characters to be those outlined in 2 above
identifier-nondigit:
  nondigit                       <- a-z, A-Z and _ 
  universal-character-name
  other implementation-defined characters
[...]

如果我们使用

clang
-pedantic-errors
标志来编译此代码,它将无法编译:

int $ = 0

并生成以下错误:

error: '$' in identifier [-Werror,-Wdollar-in-identifier-extension]
int $ = 0;
    ^

3
投票

我不这么认为。美元符号采用 ASCII 0x24 格式,不在标准附录 E.1 (charname.allowed) 中定义的任何范围内。由于它既不是数字也不是非数字,所以它必须是实现定义的字符。因此我同意这不是可移植的 C++11。另请注意,标识符不应以通用字符开头,但它允许标识符以实现允许的字符开头。


0
投票

我在最新版本的 React Native 0.76 中遇到了同样的错误,来自节点模块包,许多库有些被共享作为参考

C/C++:/Users/g/Desktop/nextfriend076/new/nextfriend/node_modules/react-native-svg/android/build/ generated/source/codegen/jni/react/renderer/components/rnsvg/EventEmitters.cpp: 39:3:警告:标识符中的“$”[-Wdollar-in-identifier-extension] C/C++: $payload.setProperty(runtime, "source", source); C/C++:^ C/C++:/Users/g/Desktop/nextfriend076/new/nextfriend/node_modules/react-native-svg/android/build/ generated/source/codegen/jni/react/renderer/components/rnsvg/EventEmitters.cpp:41 :12:警告:标识符中的“$”[-Wdollar-in-identifier-extension] C/C++:返回$payload;

© www.soinside.com 2019 - 2024. All rights reserved.