【问题标题】:Clang parameter -Wno-conditional-type-mismatch and GCCClang 参数 -Wno-conditional-type-mismatch 和 GCC
【发布时间】:2021-07-26 00:07:23
【问题描述】:

以下简单的 C 示例程序正确发出编译警告:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int *p = NULL;
    int q = 1;

    if(1 == 2 ? p : q) { printf("Info\n"); }
    return(0);
}

发出的警告是“警告:条件表达式中的指针/整数类型不匹配”。

在 clang 中,参数“-Wno-conditional-type-mismatch”的工作方式使得示例代码不会出现警告。

在 GCC 中,我一直在寻找类似的选项。我能找到的最好的是参数“-fcond-mismatch”,它允许示例代码。从手册页:

在第二个和第三个参数中允许类型不匹配的条件表达式。这 这种表达式的值是无效的。 C++ 不支持此选项。

但是当使用这个选项时,GCC 一直在抱怨:

# gcc -fcond-mismatch -c example.c
example.c: In function 'main':
example.c:8:17: warning: pointer/integer type mismatch in conditional expression
    8 |     if(1 == 2 ? p : q) { printf("Info\n"); }

使用 GCC 10.3.0,是否会有 GCC 选项或编译器标志以类似于 clang 的方式抑制警告?

【问题讨论】:

  • 为什么要这样做?好像是XY problem
  • GCC 的手册说“每个可控警告的警告消息都包含控制警告的选项。”由于此消息不包含这样的选项,这表明它是不可控的。
  • 如果-fcond-mismatch 真的应用在这里并按照它所说的做了,那么代码应该无法编译得更加困难,因为那时你将使用void 表达式作为if 的测试.
  • 为什么不应用适当的演员表?
  • 不清楚这段代码的哪些部分具有代表性,哪些部分是简化的,哪些部分可以更改,哪些部分不能更改。 1==2 是编译时常量吗?您希望编译器完全忽略未采用的三元条件运算符的操作数吗?你能把代码改成1 == 2 ? p != 0 : q != 0吗?而“one is a plain void()”:作为条件句没有任何意义。

标签: c gcc parameters clang


【解决方案1】:

我认为没有这样的标志。 GCC's manual-Werror= 下说,“每个可控警告的警告消息都包含控制警告的选项。”

由于此消息没有提到这样的选项,这表明它是不可控的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2013-08-21
    • 2020-10-27
    • 2022-12-01
    • 2015-08-18
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多