C++03 中的标识符中允许使用美元符号吗? https://stackoverflow.com/questions/936744/are-dollar-signs-allowed-in-identifiers-in-c03涵盖了 C++03 中不允许在标识符中使用美元符号。 GCC 将其提供为C扩展 https://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html#Dollar-Signs并在 C++03 模式下正确给出诊断。然而,在 C++11 中,int $ = 0
将在没有警告的情况下编译。
This answer https://stackoverflow.com/a/16055409/3920237原因是$
可能被允许,因为实现定义的标识符不需要诊断:
这里的答案是"Maybe": 根据§2.11, 身份标识
可能包括digits and 非数字标识符,从一开始
后者。非数字标识符是平常的a-z
, A-Z
和
下划线,此外,从 C++11 开始,它们还包括通用字符名称 (e.g. \uBEAF
, \UC0FFEE32
), 和其他实现定义的字符。所以它是实现定义的
如果使用$
允许在标识符中使用。 VC10及以上版本支持,
也许早期版本也是如此。它甚至支持像这样的标识符こんばんわ
.
But:我不会使用它们。使标识符尽可能可读和可移植。$
是实现定义的,因此不是
便携的。
这种语言也出现在 C++03 标准中,所以我认为这不是一个非常有说服力的论点。
§2.10/2
另外,一些标识符是保留给C++使用的
实现和标准库(17.6.4.3.2)并且不应
以其他方式使用;无需诊断。
标准允许哪些变化$
用作标识符名称?
这是实现定义的行为,$
不包含在标识符的语法中。标识符名称的规则C++11 are:
- 不能以数字开头
- 可以由字母、数字、下划线、通用字符名称等组成实施定义人物
- 不能是一个keyword http://en.cppreference.com/w/cpp/keyword
实现定义的字符被允许并且许多编译器支持作为扩展,包括gcc http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html#Dollar-Signs, clang
, 视觉工作室 http://msdn.microsoft.com/en-us/library/565w213d.aspx并如a中所述comment https://stackoverflow.com/questions/26301737/does-c11-allow-dollar-signs-in-identifiers#comment41275143_26301737显然DEV C++ 编译器 https://www.cs.auckland.ac.nz/references/c/cplusplus/cxx570_ug_003.html#index_x_142.
语法包含在C++ 标准草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf部分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;
^
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)