【发布时间】: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