2

添加的代码:

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

我该怎么做才能跳过这个警告?

4

2 回答 2

7

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

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

无论如何,如果您无法关闭该警告,您可以更改字符序列,使其在编译器中看起来相同,但不是三元组。为此,请将其中一个?字符更改为\?. 所以"??="会变成"?\?="; 这不是一个三元组,因为它不是由"??"后面跟着另一个字符的字符组成,但是一旦编译器处理了它,它就是两个问号后面跟着一个'='符号。

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

于 2018-11-18T16:49:14.477 回答
2

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

但是根据您使用的 C++ 版本,三元组仍然是标准的一部分。因此,像这样表达问号序列"?" "?" "?"将避免遇到三元组问题。编译器将看到一串"???".

于 2018-11-18T16:48:42.550 回答