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

时间:2018-11-18 16:40:41

标签: 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)") || !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

如何跳过此警告?

2 个答案:

答案 0 :(得分:7)

三字母组合序列是任何以"??"开头的字符序列;下一个字符确定序列的含义。 Trigraph序列用于(或曾经)表示某些键盘上未提供的字符。因此,例如"??="的意思是#

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

无论如何,如果您不能关闭该警告,则可以更改字符序列,以使它在编译器中看起来相同,但不是三字组。为此,请将?字符之一更改为\?。因此"??="将变成"?\?=";那不是三部曲,因为它不由字符"??"后面跟另一个字符组成,但是一旦编译器对其进行处理,它就是两个问号,后跟一个'='符号。

重新排列引用的字符串的另一种方法是将它们分开。因此"??="将变成"??" "=""?" "?=";编译器将那些相邻的字符串文字串联起来,但是,它们又不是三连字符序列,因为这些连接是在检查三连字符之后发生的。

答案 1 :(得分:2)

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

但是,根据C ++版本的不同,您使用的三字母组合仍然是标准的一部分。因此,像"?" "?" "?"这样的问题标记的明确序列将避免遇到三部曲问题。编译器将看到一个字符串"???"