【问题标题】:how can i skip those warnings? C++我怎样才能跳过这些警告? C++
【发布时间】:2018-11-18 16:40:40
【问题描述】:

添加代码:

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

如何跳过此警告?

【问题讨论】:

  • 那些警告很搞笑。
  • 添加了太多代码。 一些测试对警告没有贡献。是以“??”开头的序列引入三元组。
  • 我应该删除一些“??”
  • 你用的是什么编译器?
  • 你使用的是哪个编译器?

标签: c++ trigraphs


【解决方案1】:

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

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

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

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

【讨论】:

  • 从 c++17 的标准中移除。
  • @johnathan -- 谢谢。实际上,它们从编译器中移除的时间比这要长得多。 我在 80 年代为 Borland 做的第一个项目是编写一个独立的预处理器来扩展三元组,因为他们的 C 编译器没有这样做。我记得这很常见。
  • 我使用了“\?”现在编译没有警告!谢谢
  • @Pete Becker np。那种让编译器困惑的挥之不去的向后兼容性终于消失了。所以你在 borland 团队移植到 IBM 机器?这些是 iirc 的关键,也是为什么一开始就添加了三元组。
  • @johnathan -- 不,只是回应一些用户投诉;有些人实际上想使用三元组。与搞砸扫描仪相比,预处理源文件的侵入性更小。有时政治会影响设计决策...
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2016-08-28
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2013-07-09
    • 2015-06-13
    • 2014-12-16
    • 2018-03-26
    相关资源
    最近更新 更多