繁体   English   中英

回车为以C ++文件结尾的行

[英]Carriage return as line ending in c++ file

我一直在阅读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;
}

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

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

编译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;
}

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

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

您应该得出以下结论:

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

嗯,您从标准中提供的报价也不相关。 那里的换行引用源字符集,而不是字符串中的\\r\\n 您引用的语法规则仅排除字符串文字,例如:

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

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

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

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

实际上,在任何现代编译器上,对于行尾使用换行符都是安全的。

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

dos2unix(1)工具仅用于此任务。

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

现在,关于换行符,当行尾为'\\ r'时,我看到一个问题...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM