C++ 以c+结尾的回车行+;文件

C++ 以c+结尾的回车行+;文件,c++,visual-c++,gcc,C++,Visual C++,Gcc,我一直在阅读ISO 14882:2003。它说: s字符: 源字符集的任何成员,双引号、反斜杠或新行字符除外 转义序列 通用字符名 现在,关于新行字符,当行尾为'\r' 我编写了一个小型cpp程序: #include <fstream> #include <string> int main() { const char* program="" "#include <string>\n" "int main()\n"

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

s字符:
源字符集的任何成员,双引号、反斜杠或新行字符除外 转义序列
通用字符名

现在,关于新行字符,当行尾为'\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;
}
#包括
#包括
int main()
{
const char*program=“”
“#包括\n”
“int main()\n”
“{\n”
“std::字符串s;\n”
“//s=\”\r”
“//\r”
“//\r”
“//\r”
“//\”;\n”
“s=\“\\xAE\\xffactory\\xAE\\xffection\”;\n”
“返回0;\n”
“}\n”
;
std::of流文件(“file.cpp”,std::ios_base::trunc);

文件Windows和linux使用不同的行尾约定。在linux上,行尾是
0x0A
,在Windows上,行尾是
0x0D,0x0A
。C/C++程序本身就是文本文件,通常可以跨平台互操作,只要您遵守平台上的文本约定

该工具是专门为这项任务构建的


或者,由于您在自己的工具中动态生成此代码,您可以提供一个选项,告诉它使用一种行尾样式或另一种。您应该得出以下结论:

  • VS编辑器可以理解任何行尾,因此可以将其显示为多行(这是一个已知的特性)
  • MSVC编译器不理解
    \r
    行的结尾,因此它实际上将
    “;
    行计算为第6行
  • emacs
    不理解
    \r
    行的结尾(至少在默认情况下),因此它在一行中显示源代码
  • GCC理解任何行的结尾,因此它不会丢失计数
  • 啊,您从标准中提供的引用也是不相关的。这里的新行指的是源字符集,而不是字符串中的
    \r
    \n
    。您引用的语法规则仅排除字符串文字,例如:

    const char* s = "some text, here comes 'new-line'
        ha ha ";
    

    第2.1节[法律阶段]。翻译的第一阶段是:

    如有必要,将以实现定义的方式将物理源文件字符映射到基本源字符集(为行尾指示符引入新行字符)

    换句话说,实现可以自由地使用它想要的任何行尾约定,并在翻译的第一阶段将其转换为换行符

    实际上,在任何现代编译器上使用换行符作为行尾应该是安全的

    现在,关于新行字符,当行尾为“\r”时,我看到一个问题

    “\r”是回车,不是换行符,所以我不确定问题出在哪里


    Windows选择了一些将\r表示为换行符的魔法,但这并不意味着它们实际上是换行符

    回车就是返回“回车”在旧的打字机上,打印到行首,而不是下一行。UNIX和UNIX系统只使用
    \n
    作为新行字符,而Windows使用
    \r\n
    。显然,VS可以处理单回车作为行尾,但UNIX世界中的许多编辑器不这样做,因为从技术上讲,它不是行尾行。如果你足够聪明,能够阅读ISO标准,我很惊讶你不能通过简单的搜索找到答案。这似乎是一个你已经知道答案的问题。感谢ISO参考。现在它变得更清晰了。实际上,行的末尾取决于操作系统。新行NL(LF)是清晰的(表5)编译器的行为是定义的实现。我编写一个小的词法。我已经使用了C++标准的“字符串文字”作为语法规则,它包含“S字符”。规则。在我的测试中,任何包含双引号内CR的字符串文字都被接受。我尝试了gcc和mvc,因此我观察到了差异。但是@Bartholomew也有一个很好的观点。谢谢你的回答。谢谢你的工具推荐。我会尝试一下。
    #include <string>
    int main()
    {
      std::string s;
      //s="^M  //^M  //^M  //^M  //";
      s="\xAE\xfffactory\xAE\xffaction";
      return 0;
    }
    
    const char* s = "some text, here comes 'new-line'
        ha ha ";