使用预处理程序指令来定义美元符号代表什么会导致任何冲突吗?

Som*_*ium 6 c++ dollar-sign c-preprocessor

我可以在C++中使用以下内容吗?:

#define $ cout

int main(){
    $<<"Hello World!\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想知道它是否会引起任何冲突.

Lig*_*ica 10

它不是绝对合法的,但允许您的实施接受它.

考虑:

[C++11: 2.5/1]: 转换为令牌(2.7)的每个预处理令牌应具有关键字,标识符,文字,运算符或标点符号的词法形式.

在这里,你$显然不是一个关键字,运算符或标点符号(因为它们在标准中列举),它看起来不像文字,所以它只能是一个标识符; 现在,标识符必须只包含字母数字和下划线,并且数字不能超前(基于下面的语法[C++11: 2.11]).

但是,该标准还允许实现接受其他字符,因此您想要做的可能有效,但它不可移植.

  • @ MichaelJ.Gray:无法超链接到C++标准.唯一需要的参考是标准的名称("C++ 11"是缩写)和该文档中的段落编号.我可以在所有答案中链接到最后的C++ 11前工作草案PDF,但我真的不认为这是在他们的范围内.欢迎读者使用他们自己的狡猾和精神实力查找参考资料,就像你走到图书馆寻找以同样方式引用的科学论文一样. (5认同)
  • 实际上,更准确地说,语法确实允许*实现定义的字符*。 (2认同)

Sha*_*our 5

这是实现定义的行为。$不包含在标识符的语法中C++中标识符名称的规则是:

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

但它确实允许实现定义的字符,许多编译器都支持这些字符作为扩展,包括gccVisual Studio .

实际语法包含在C++ 标准草案部分2.11 Indentifier中:

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
[...]
Run Code Online (Sandbox Code Playgroud)

我们可以看到这适用于预处理指令define部分。从语法上我们可以看出它一定是一个标识符16

# define identifier replacement-list new-line
# define identifier lparen identifier-listopt) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list, ... ) replacement-list new-line
         ^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

  • 另外值得一提的是,MSVC 也有香蕉扩展!https://dl.dropboxusercontent.com/u/247271563/intelliBananas.png (4认同)