我可以在C++中使用以下内容吗?
#define $ cout
int main(){
$<<"Hello World!\n";
return 0;
}
我想知道它是否会引起任何冲突。
我可以在C++中使用以下内容吗?
#define $ cout
int main(){
$<<"Hello World!\n";
return 0;
}
我想知道它是否会引起任何冲突。
这不是绝对合法的,但您的实现可以接受它。
考虑:
[C++11: 2.5/1]:
每个被转换为标记 (2.7) 的预处理标记都应具有关键字、标识符、文字、运算符或标点符号的词汇形式。
在这里,你$
显然不是关键字、运算符或标点符号(因为这些都在标准中枚举),而且它看起来不像文字,所以它只能是一个标识符;现在,标识符必须只包含字母数字和下划线,并且数字不能是前导(基于下面表示的语法[C++11: 2.11]
)。
但是,该标准还允许实现接受其他字符,因此您想做的事情可能会起作用,但它不会是可移植的。
这是实现定义的行为。不包含在标识符的语法中, C++$
中标识符名称的规则是:
但它确实允许许多编译器作为扩展支持的实现定义的字符,包括gcc和Visual Studio。
C++ 标准草案的2.11
Identifier部分涵盖了实际的语法:
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
[...]
我们可以define
从16
Preprocessing directives部分看到这适用于。从语法中我们可以看出它必须是一个标识符:
# 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
^^^^^^^^^^
$
一些允许在标识符中使用的编译器有一个有趣的情况。例如,至少 MS VC++ 2010 允许$
在标识符中使用。
因此,例如,如果您定义
char $ = '$';
然后写了
#define $ std::cout
//...
$ << $;
然后您将在控制台输出数字 1 或某个整数中看到符号 $ 而不是符号。:)