我有相当于下面的代码来打印一个短字符串:
#include <iostream>
#include <string>
int main(int argc, const char* argv[])
{
std::string s = "finished??/not finished??";
std::cout << s << std::endl;
return 0;
}
但是输出显示在两行中并且丢失了一些字符:
finished
ot finished??
但/n
不是新行字符!发生了什么事?
答案 0 :(得分:4)
在翻译的第一阶段( ISO / IEC 14882:2011(E)的§2.2/ 1),被称为三字符序列的字符序列被替换为单个字符。
Trigraph sequence(2.4)被相应的单字符内部表示替换。
其中一个三元图将??/
映射到\
。在第一阶段之后,代码相当于:
#include <iostream>
#include <string>
int main(int argc, const char* argv[])
{
std::string s = "finished\not finished??";
std::cout << s << std::endl;
return 0;
}
作为预处理阶段的结果,"finished\not finished??"
被解析为包含表示新行字符的转义序列\n
的字符串文字。因此输出的字符串为:finished<NL>ot finished??
。
为避免这种情况,您需要将其中一个问号转义为\?
。这给你:
#include <iostream>
#include <string>
int main(int argc, const char* argv[])
{
std::string s = "finished?\?/not finished??";
std::cout << s << std::endl;
return 0;
}
这可以避免将??/
作为三字母拾取。
答案 1 :(得分:0)
在gcc 4.1.2中,我收到此警告:
cd / devserv-home / rspikol / g ++ -g -o tz tz.C tz.C:6:28:警告:trigraph ?? / ignored,使用-trigraphs启用
汇编于10月3日星期三12:43:16完成
因此,默认情况下,此版本的gcc不符合C ++标准。
@sftrabbit:在我的C ++标准副本中,段落是2.3 / 1