Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++ 为什么在出现注释时忽略此简单程序中的条件?_C++ - Fatal编程技术网

C++ 为什么在出现注释时忽略此简单程序中的条件?

C++ 为什么在出现注释时忽略此简单程序中的条件?,c++,C++,这个简单的程序应该不打印任何内容: #include <iostream> int main() { // the condition below is ignored! \\ if (false) std::cout << "hello, world\n"; } #包括 int main() { //忽略以下条件\\ if(false) std::coutThe\\正在转义换行符,并将if(false)作为注释的一部分 作为解释,C++

这个简单的程序应该不打印任何内容:

#include <iostream>
int main()
{
    // the condition below is ignored! \\
    if (false)
        std::cout << "hello, world\n";
}
#包括
int main()
{
//忽略以下条件\\
if(false)

std::coutThe
\\
正在转义换行符,并将
if(false)
作为注释的一部分

作为解释,C++代码中的一行中的“代码”> \代码>字符表示预处理程序,下一行将被视为前一行的延续。因此,代码> > /COD>有时被称为行连续字符。对于多行定义,这通常是有用的。

#定义我的_LONG_宏\
对于(int i=0;i<10;i++)\

{std::cout单个
\
是一个行连续字符,表示下一行是此行的一部分。不管有多少
\
,只有最后一行使下一行成为第一行的一部分,前面的
\
只是注释的一部分


这是因为在行尾的
\
后面紧跟着表示下一行被认为是这一行的完成

这通常与字符串一起使用,例如:

string s = "sdgfdgfdgfdg\
       dssdfsdf";
如果上面的单个反斜杠后面有一个空格,那么您将得到一个编译时错误

您可以在它之后添加空白,一切都会好起来,例如:

// the condition below is ignored! \\[white space]
if (false)
    std::cout << "hello, world\n";
//忽略以下条件!\\[空白]
if(false)

std::无法删除
\\
注释。如果(false),则生成下一行
ignored你不知道,而且据我所知,你不能关闭单行评论。提问者知道或不知道该评论相关。不管怎样,这都是一个糟糕的问题。如果他们不知道该评论相关,他们应该删除它。如果他们知道,为什么不提及就提问?这是一个糟糕的问题。gcc/clang给出正确的警告“警告:多行注释[-Wcomment]”@DavidSchwartz这是一个自我回答问题的完美设置,但这里的情况似乎不是这样。我猜他只是想展示一个谜题。@DietmarKühl谢谢你的评论。我可以发誓我以前也这么做过,但我现在只是用g++尝试了一下,空格没有用。我编辑了我的答案。第一阶段是根据2.2[lex.phases]第1段定义的实现映射。显然,gcc在某个地方记录了这种奇怪的行为(尽管到目前为止我还没有发现在哪里)。@DietmarKühl FWIW ISO/IEC 14882:2003指出“删除新行字符和前一个反斜杠字符的每个实例,将物理源行拼接成逻辑源行。”是的。但是,第一阶段的翻译说明源字符的映射是实现定义的。我猜gcc(和其他)可能将该转换定义为允许忽略反斜杠和换行符之间的空格,以便使用行尾序列进行复制,如
\r\n
在所有系统上都可以工作。对于gcc、clang和xlC,添加空格没有帮助。对于Sun CC,则有帮助。
// the condition below is ignored! \\[white space]
if (false)
    std::cout << "hello, world\n";