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



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

s-char:
源字符集的任何成员,除了双引号"、反斜杠或换行字符转义序列
universal-character-name

现在,关于换行字符,当行以'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;
}

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

#include <string>
int main()
{
  std::string s;
  //s="
  //
  //
  //
  //";
  s="xAExfffactoryxAExffaction";
  return 0;
}

编译file.cpp时,VS会在第6行触发错误,而不是在第10行。

在Linux上,file.cpp(在emacs中读取)为:

#include <string>
int main()
{
  std::string s;
  //s="^M  //^M  //^M  //^M  //";
  s="xAExfffactoryxAExffaction";
  return 0;
}

使用gcc编译file.cpp时,在第10行出现错误,而不是在第6行。

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

你应该得出结论:

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

啊,你提供的标准报价也不相关。这里的换行指的是源字符集,而不是字符串中的rn。您引用的语法规则只排除字符串字面值,如:

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

Section 2.1 [lex.phases]。翻译的第一阶段是:

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

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

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

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

dos2unix(1)工具是专门为这个任务构建的。

或者,由于您是在您自己的工具中动态生成这些代码,您可以提供一个选项,告诉它使用一种行结束样式或另一种。

现在,关于换行字符,我看到一个问题,当行结束是'r'…

'r'是一个回车,而不是换行-所以我不确定问题是什么?

Windows选择将r表示为换行符,但这并不意味着它们实际上是换行符

最新更新