考虑一下这个无害的C++程序:
#include <iostream>
int main() {
std::cout << "(Is this a trigraph??)" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用g ++版本5.4.0编译它时,我得到以下诊断:
me@my-laptop:~/code/C++$ g++ -c test_trigraph.cpp
test_trigraph.cpp:4:36: warning: trigraph ??) ignored, use -trigraphs to enable [-Wtrigraphs]
std::cout << "(Is this a trigraph??)" << std::endl;
^
Run Code Online (Sandbox Code Playgroud)
程序运行,其输出符合预期:
(Is this a trigraph??)
Run Code Online (Sandbox Code Playgroud)
为什么要为三字符分析字符串文字呢?
其他编译器也这样做吗?
Trigraph在翻译阶段1处理(然而,它们在C++ 17中被删除).字符串文字相关处理在后续阶段发生.由于C++ 14标准指定(n4140)[lex.phases] /1.1:
翻译语法规则的优先级由以下阶段指定.
- 如果需要,物理源文件字符以实现定义的方式映射到基本源字符集(引入行尾指示符的换行符).接受的物理源文件字符集是实现定义的.Trigraph序列([lex.trigraph])被相应的单字符内部表示替换. 不在基本源字符集([lex.charset])中的任何源文件字符将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即,使用\ uXXXX表示法),处理等效,除非在原始字符串文字中还原此替换.)
这首先发生了,因为正如你在评论中被告知的那样,三卦代表的角色也需要打印.