[英]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行出现错误。
我应该从中得出什么结论?
您应该得出以下结论:
\\r
行尾,因此实际上会将";
行计为第六行。 emacs
不了解\\r
行尾(至少默认情况下),因此它在一行中显示源。 嗯,您从标准中提供的报价也不相关。 那里的换行引用源字符集,而不是字符串中的\\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.