C++ 是否有一个开关来禁用带有叮当声的三角图?
我有一些(遗留的)代码,这是我第一次用clang构建的。代码类似于:C++ 是否有一个开关来禁用带有叮当声的三角图?,c++,clang,trigraphs,C++,Clang,Trigraphs,我有一些(遗留的)代码,这是我第一次用clang构建的。代码类似于: sprintf(buf, "%s <%s ????>", p1, p2); 很明显,??>并不是作为trigraph使用的,所以我想完全禁用trigraph(源代码并不有意在任何地方使用它们) 我尝试了-没有三角图,但这不是一个真正的选项: clang: warning: argument unused during compilation: '-no-trigraphs' 我可以使用-Wno trigraph
sprintf(buf, "%s <%s ????>", p1, p2);
很明显,??>
并不是作为trigraph使用的,所以我想完全禁用trigraph(源代码并不有意在任何地方使用它们)
我尝试了-没有三角图
,但这不是一个真正的选项:
clang: warning: argument unused during compilation: '-no-trigraphs'
我可以使用-Wno trigraphs
关闭trigraphs警告,但我根本不希望trigraphs转换实际发生
注意:启用Trigraphs是由于使用
-std=c89
的意外副作用,我看不到禁用Trigraphs的明显方法(而不是Trigraphs警告)。修复此代码的最简单方法可能是将其更改为:
sprintf(buf, "%s <%s ????"">", p1, p2);
sprintf(buf,“%s”,p1,p2);
尝试使用gnu*模式-“在gnu*模式下,Trigraphs默认为关闭;它们可以通过-Trigraphs选项启用。”(有关其他差异和命令行开关的信息,请参阅)哎哟!GCC有一个明智的政策,即忽略trigraphs,即使是在严格的合规模式下,除非您用-trigraphs
来控制它。爆发的时间sed
?实际上,GCC的严格合规模式(-std=c89
,-std=c99
,等等)确实开启了trigraph转换。如果有人想知道什么是trigraph。。。是吗?[…暂停…进行实验…]哦,是的,显然是这样。哦,那很好;这节省了我在源代码中进行搜索的时间,因为这些东西可以正常工作。我会将-Wtrigraphs
添加到我的uber Fusy编译选项中一段时间,或者进行grepping,我想,但我没有看到任何问题,所以它不太可能困扰我。@JonathanLeffler:-Wtrigraphs
默认为打开,只要你不请求trigraph转换(显式或隐式)。这似乎是一个合理的选项。在数百万行源代码中,??>
只出现四次。“…?\?>”
也应该有效。将反斜杠放在trigraph本身的两个问号之间。由于trigraph可以出现在任何地方,因此可以使用sed“s/??\([-()\/=\'])/?\?\1/g“
将任何trigraph转换为安全序列。另一方面,在字符串之外,可能最好将trigraph转换为其标准形式?决定什么是最好的有点棘手。(这一次,我的sed
脚本在模式周围使用了双引号,因为模式中只有一个引号。)啊,就是这样!我使用的是-std=c89
,但是使用-std=gnu89
我得到一条消息错误:trigraph被忽略[-Werror,-Wtrigraphs]
,我可以使用-Wno trigraphs
禁用trigraphs。有没有一种方法可以在不启用gnu扩展的情况下禁用trigraphs?
sprintf(buf, "%s <%s ????"">", p1, p2);