关于下划线名称的问题部分回答了here,,但答案不完整,或者我没有完全理解。下划线,名称和文字运算符
Sect。在C++ 11标准的2.14.8.7声明此字面操作者作为一个例子:
long double operator "" _w(long double);
除了声明操作中,标准及其实施例做进一步的两件事情是,如果单独看,每个有意义:
- 它开始名称
_w
带下划线;和 - 它将运算符放在全局名称空间中。
我的问题有两个部分:
- 根据the answer linked above,名称
_w
不是标识符,或标识_w
是不是一个名,或...好,我是米困惑。 - 如果
_w
没问题,那么大写的_W
也可以 -60.0_W
,意思是60.0瓦特?还是预处理器可能会错误地处理大写的版本?
毫无疑问,和你一样,我不习惯用下划线开始全局名称,这是习惯标准教派的习惯。 17.6.4.3.2.1显然似乎不赞成。因此,如果您可以对下划线,名称和文字操作符进行一些更多的说明,则可以欣赏灯光。
'_W'会引起麻烦,作为一个'#定义_W/* *什么/'之前字面经营者的定义会导致'_W'到被替换。这不是'_W'中的'_W'被保留,但是实现可能像上面那样有一个宏'_W'。现在,人们可能会怀疑标准是否真的允许在字面操作符标识符上进行宏替换,并且我会说是,因为'_W'是一个单独的预处理器标记。 – Xeo
@Xeo:谢谢。你碰巧知道标准中的哪个地方解释说'_W'会引起麻烦吗?如果是这样,我想阅读该部分。 – thb
对于预处理阶段/标记,大多是子条款2.2和2.5。 '_W'是一个*标识符*,因此它是一个*预处理标记*,如果它命名一个宏,它将在阶段4中展开。 – Xeo