使用预处理器指令定义美元符号表示的内容会导致冲突吗? 我可以在C++中使用以下吗? #定义$cout int main(){ $
有些编译器允许在标识符中使用使用预处理器指令定义美元符号表示的内容会导致冲突吗? 我可以在C++中使用以下吗? #定义$cout int main(){ $,c++,c-preprocessor,dollar-sign,C++,C Preprocessor,Dollar Sign,有些编译器允许在标识符中使用$。例如,至少MS VC++2010允许在标识符中使用$ 例如,如果您定义了 char $ = '$'; 然后写 #define $ std::cout //... $ << $; #定义$std::cout //... $它不完全合法,但允许您的实现接受它 考虑: [C++11:2.5/1]:转换为标记(2.7)的每个预处理标记应具有关键字、标识符、文字、运算符或标点符号的词汇形式 在这里,您的$显然不是关键字、运算符或标点符号(正如标准中列举的那
$
。例如,至少MS VC++2010允许在标识符中使用$
例如,如果您定义了
char $ = '$';
然后写
#define $ std::cout
//...
$ << $;
#定义$std::cout
//...
$它不完全合法,但允许您的实现接受它
考虑:
[C++11:2.5/1]:
转换为标记(2.7)的每个预处理标记应具有关键字、标识符、文字、运算符或标点符号的词汇形式
在这里,您的$
显然不是关键字、运算符或标点符号(正如标准中列举的那样),它看起来也不像文字,因此它只能是一个标识符;现在,标识符必须只包含字母数字和下划线,并且数字不能是前导字符(基于[C++11:2.11]中表示的语法)
)
但是,标准也允许实现接受其他字符,所以您想做的工作可能是有效的,但是它不是可移植的。
< P>这是实现定义的行为。<代码> $< /C> >不包括在语法中的标识符。C++中的标识符名称的规则是:
它不能以数字开头
可以由字母、数字、下划线、通用字符名和实现定义的字符组成
不可能是一个
但它确实允许实现定义的字符,许多编译器支持这些字符作为扩展,包括和
实际语法在2.11节
标识符中介绍:
这也会使您的代码难以阅读。如果您希望打印包含美元符号的字符串,该怎么办?似乎这会带来比避免的麻烦多得多。“将此类内容留给jQuery”,这将是我的建议。@enhzflep:预处理器指令不涉及字符串文字。为什么投票失败,OP会问它是否有效。我不赞成,但这仍然是一个有效的问题。@melak47,每个人都在说,“jQuery不够”因此,我们试图用C++的精确语法添加它,也值得一提的是,MSVC也有香蕉的扩展名。@ MelaK47,它是根据我所知的通用字符名而存在的,因此它将是一个扩展。@ PrasMah旧Borland编译器的1而不是STD::CUT的实际地址。当它被转换为空指针时,URE被调用。@ PcLasHyh,当然,你得到与和STD::CUT的相同;行>代码>实际上更精确的语法允许实现定义的字符。@ Migelj.Grand:不可能超链接到C++标准。f标准(“C++11”是缩写)以及该文档中的段落号。我可以在所有答案中链接到C++11之前的最后一份PDF工作草案,但我真的不认为这在他们的范围之内。如果读者愿意,欢迎他们使用他们自己的狡猾和智慧查找参考资料,就像你去图书馆查找科学论文一样per也是以同样的方式引用的。@ShafikYaghmour:啊哈,你完全正确!我在中编辑了它。谢谢。不,$
可以是一个前导字符,因为它可以是一个非数字标识符。我怀疑这个链接是否有用
#define $ std::cout
//...
$ << $;
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 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
^^^^^^^^^^