避免出现 trigraph sequences
3.7.1 ID_literal_trigraphs
由于少数键盘无法输出所有 C/C++ 标准字符,C/C++ 语言允许使用 trigraph sequences 代替无法输出的字符,但可能会导致意外的结果,且可读性较差,已从 C++17 标准中移除。
Trigraph sequence 由两个问号和另一个特定字符组成:
??= # ??) ] ??! |
??( [ ??' ^ ??> }
??/ \ ??< { ??- ~
如 ??= 替代 #,??- 替代 ~。
示例:
int main(void) {
printf("what??!\n"); // Non-compliant
}
如果启用 trigraph sequences,编译器会在词法分析之前完成替换,与问号相关的字符组合可能会与预期不符,示例代码将输出“what|”而不是“what??!”。
应改为:
int main(void) {
printf("what\?\?!\n"); // Compliant
}
相关
依据
ISO/IEC 9899:1999 5.2.1.1
ISO/IEC 9899:2011 5.2.1.1
ISO/IEC 14882:2003 2.3
ISO/IEC 14882:2011 2.4
ISO/IEC 14882:2017 C.4.1
参考
MISRA C 2004 4.2
MISRA C 2012 4.2
MISRA C++ 2008 2-3-1
SEI CERT PRE07-C