回车在c ++文件中以行结尾

gra*_*asm 0 c++ gcc visual-c++

我一直在阅读ISO 14882:2003.它说:

S-CHAR:
源字符集除了双引号",反斜线\,或换行字符的任何成员 转义序列
通用字符名称

现在,关于换行符,当行结尾为'\ r'时,我看到一个问题,
我写了一个小cpp程序:

#include <fstream>
#include <string>
int main()
{
    const char* program=""
        "#include <string>\n"
        "int main()\n"
        "{\n"
        "  std::string s;\n"
        "  //s=\"\r"
        "  //\r"
        "  //\r"
        "  //\r"
        "  //\";\n"
        "  s=\"\\xAE\\xfffactory\\xAE\\xffaction\";\n"
        "  return 0;\n"
        "}\n"
        ;
    std::ofstream file("file.cpp", std::ios_base::trunc);
    file << program;
    file.close();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Windows上,file.cpp(在VS编辑器中读取)是:

#include <string>
int main()
{
  std::string s;
  //s="
  //
  //
  //
  //";
  s="\xAE\xfffactory\xAE\xffaction";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译file.cpp时,VS触发并在第6行中出错,而不是第10行.

在Linux上,file.cpp(如emacs中所读)是:

#include <string>
int main()
{
  std::string s;
  //s="^M  //^M  //^M  //^M  //";
  s="\xAE\xfffactory\xAE\xffaction";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

用gcc编译file.cpp我在第10行得到一个错误,而不是在第6行.

我应该从中得出什么结论?

ybu*_*ill 6

你应该得出结论:

  1. VS编辑器理解任何行结尾,因此将其显示为多行(嗯,这是一个已知的功能).
  2. MSVC编译器不理解\r行结尾,因此它实际上将该";行计为第6行.
  3. emacs不理解\r行结尾(至少默认情况下),因此它会在一行中显示源代码.
  4. GCC理解任何行结尾,因此它不会丢失计数.

啊,你从标准中提供的报价也是无关的.在新线有指源代码字符集,而不是\r\n字符串中.您引用的语法规则只排除字符串文字,例如:

const char* s = "some text, here comes 'new-line'
    ha ha ";
Run Code Online (Sandbox Code Playgroud)