Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用预处理器指令定义美元符号表示的内容会导致冲突吗? 我可以在C++中使用以下吗? #定义$cout int main(){ $_C++_C Preprocessor_Dollar Sign - Fatal编程技术网

使用预处理器指令定义美元符号表示的内容会导致冲突吗? 我可以在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
             ^^^^^^^^^^