Is there a switch to disable trigraphs with clang?
我有一些(遗留的)代码是我第一次用clang构建的。代码类似于:
1
| sprintf(buf,"%s <%s ????>", p1, p2); |
clang给出以下警告(-Werror出错):
1 2 3
| test.c:6:33: error: trigraph converted to '}' character [-Werror,-Wtrigraphs]
sprintf(buf,"%s <%s ????>", p1, p2);
^ |
很明显,??>并不是打算作为一个三段图,所以我想完全禁用三段图(源代码没有有意在任何地方使用它们)。
我试过-no-trigraphs,但这不是一个真正的选择:
1
| clang: warning: argument unused during compilation: '-no-trigraphs' |
我可以用-Wno-trigraphs关闭三角警告,但我不希望三角转换实际发生。
注意:使用-std=c89时,会产生意外的副作用。
- 哎哟!GCC有一个明智的策略,即使在严格的遵从模式下,也忽略了三角图,除非你用-trigraphs握住它的手开火。是时候爆发了吗?或同等产品。
- 实际上,GCC的严格遵从模式(-std=c89、-std=c99等)确实开启了三角图转换。
- 如果有人想知道这是一个三角图。这是小马……
- 他们这样做了吗?[暂停…进行实验…]哦,是的,很明显是的。哦,那很好,它省去了我在源代码中搜索的麻烦,因为这些东西都可以工作。我会把-Wtrigraphs添加到我的超级繁琐的编译选项中一段时间,或者说,我想,做得非常好,但是我没有看到任何问题,所以它不太可能困扰我。
- @jonathanleffer:-Wtrigraphs在默认情况下是打开的,只要您不请求三角图转换(显式或隐式)。
尝试使用GNU*模式-"Trigraphs在GNU*模式下默认为关闭;它们可以通过-Trigraphs选项启用。"(有关其他差异和命令行开关,请参见http://clang.llvm.org/docs/usersmanual.html c_模式)
- 啊,就是这样!我用的是-std=c89,但用-std=gnu89,我得到的信息是error: trigraph ignored [-Werror,-Wtrigraphs],我可以用-Wno-trigraphs禁用它。
- 有没有一种方法可以在不启用GNU扩展的情况下禁用三角图?
我看不到一个明显的方法来禁用三角图(而不是三角图警告)。修复此代码的最简单方法可能是将其更改为:
1
| sprintf(buf,"%s <%s ????"">", p1, p2); |
- 这似乎是一个合理的选择。在数以百万计的数据源中,??>只出现了四次。
- "...???\?>"也应该起作用。把反斜杠放在三角图本身的两个问号之间。
- 因为三角图可以出现在任何地方,所以可能sed"s/??\([-<>()\/=#']\)/?\\?\1/g"将任何三角图转换为安全序列。另一方面,在字符串之外,也许三角图最好转换成它的标准形式?决定什么是最好的有点困难。(仅此一次,我的sed脚本在模式周围使用双引号,因为模式中只有一个引号。)