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]
).
但是,该标准还允许实现接受其他字符,因此您想要做的可能有效,但它不可移植.
这是实现定义的行为。$
不包含在标识符的语法中C++中标识符名称的规则是:
但它确实允许实现定义的字符,许多编译器都支持这些字符作为扩展,包括gcc和Visual 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)
归档时间: |
|
查看次数: |
853 次 |
最近记录: |