Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有一个开关来禁用带有叮当声的三角图?_C++_Clang_Trigraphs - Fatal编程技术网

C++ 是否有一个开关来禁用带有叮当声的三角图?

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

我有一些(遗留的)代码,这是我第一次用clang构建的。代码类似于:

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);