C++ 如何跳过这些警告?C++;

C++ 如何跳过这些警告?C++;,c++,trigraphs,C++,Trigraphs,新增代码: bool CHARACTER::SpamAllowBuf(const char *Message) { if (!strcmp(Message, "(?˛´c)") || !strcmp(Message, "(μ·)") || !strcmp(Message, "(±a≫Y)") || !strcmp(Message, "(AA??)") || !strcmp(Message, "(≫c¶?)") || !strcmp(Message, "(?đłe)") || !strcm

新增代码:

bool CHARACTER::SpamAllowBuf(const char *Message)
{
    if (!strcmp(Message, "(?˛´c)") || !strcmp(Message, "(μ·)") || !strcmp(Message, "(±a≫Y)") || !strcmp(Message, "(AA??)") || !strcmp(Message, "(≫c¶?)") || !strcmp(Message, "(?đłe)") || !strcmp(Message, "(??C?)") || !strcmp(Message, "(????)") || !strcmp(Message, "(AE??)"))
    {
        return true;
    }

    return false;
}
警告包括:

char.cpp:7254:121: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7254:245: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7254:275: warning: trigraph ??) ignored, use -trigraphs to enable

如何跳过此警告?

要回答您的问题,请使用
-Wno trigraphs
(如果使用gcc/clang)


<> P>但是根据C++的版本,你使用的三叉树仍然是标准的一部分。因此,像这样表达问号序列可以避免碰到三角图问题。编译器将看到一个字符串
“?”

三角图序列是以
“?”
开头的任何字符序列;下一个字符决定序列的含义。Trigraph序列用于(或曾经用于)表示某些键盘上未提供的字符。因此,例如,
“??=”
意味着
#

三角图序列不再被广泛使用;我还没有检查过,但是它们可能已经被C++删除或完全删除。(感谢@johnathan指出它们在C++17中被删除)

在任何情况下,如果无法关闭该警告,则可以更改字符序列,使其在编译器看来相同,但不是trigraph。为此,请将其中一个
字符更改为
\?
。所以
“??=”
将变成
“?\?=”
;这不是三角图,因为它不是由字符
“?”
后跟另一个字符组成的,但是一旦编译器处理了它,它就是两个问号后跟一个
“=”
符号


重新排列带引号的字符串的另一种方法是将它们分开。所以
“??=”
将变成
“??=”
“?”?=”
;编译器将这些相邻的字符串文本连接起来,但是,同样,它们不是trigraphs序列,因为连接是在检查trigraphs之后发生的。

这些警告非常有趣。添加了太多代码。有几项测试没有引起警告。正是以“?”开头的序列引入了三角图。我是否应该删除一些“?”你在使用什么编译器?你在使用哪个编译器?从c++17的标准中删除。@johnathan--谢谢。实际上,从编译器中删除它们的时间要长得多。我在80年代为Borland做的第一个项目之一是编写一个独立的预处理器来扩展Trigraph,因为他们的C编译器没有这样做。我记得这很常见。我使用了“\?”,现在编译时没有警告!Thanks@Pete贝克尔np。困扰编译器的那种挥之不去的向后兼容性最终消失了。那么你是在borland团队中移植到IBM机器的?这就是iirc的关键所在,也是为什么trigraphs一开始就被添加的原因。@johnathan--不,只是回应了一些用户投诉;有些人真的想用三角图。对源文件进行预处理比搞乱扫描仪的侵入性小。有时政治会影响设计决策。。。