Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当赋值(用括号括起来)用作真值时,强制GCC抛出错误_C_Gcc - Fatal编程技术网

当赋值(用括号括起来)用作真值时,强制GCC抛出错误

当赋值(用括号括起来)用作真值时,强制GCC抛出错误,c,gcc,C,Gcc,我试图找到一个GCC编译器标志,它会导致GCC拒绝编译以下代码: #包括 int main() { int x=1; 如果((x=10)){ printf(“x是10”); }否则{ printf(“x不是10”); } 返回0; } 上面的代码将在编译时没有警告: gcc-Wall-Werror-O3-o x.exe x.c 具体地说,我希望GCC在if((x=10))行中呕吐。如果我拆下内括号,GCC将由于-Werror gcc -Wall -Werror -O3 -o x.exe x.c

我试图找到一个GCC编译器标志,它会导致GCC拒绝编译以下代码:

#包括
int main()
{
int x=1;
如果((x=10)){
printf(“x是10”);
}否则{
printf(“x不是10”);
}
返回0;
}
上面的代码将在编译时没有警告:

gcc-Wall-Werror-O3-o x.exe x.c

具体地说,我希望GCC在
if((x=10))
行中呕吐。如果我拆下内括号,GCC将由于
-Werror

gcc -Wall -Werror -O3 -o x.exe x.c
x.c: In function 'main':
x.c:7:9: error: suggest parentheses around assignment used as truth value [-Werror=parentheses]
     if( x = 10 ) {
         ^
cc1.exe: all warnings being treated as errors
我要寻找的是一种迫使GCC拒绝编译代码的方法,即使有括号


谢谢

似乎没有办法说服GCC这么做<代码>-Wall-Wextra不会对示例代码发出警告,我也没有看到任何其他相关的警告选项。(如评论中所述,根据GCC的设计,通常使其拒绝其他合法代码的唯一方法是找到代码触发的警告选项,然后使用
-Werror
将警告升级为错误。)

作为另一个数据点,clang提供了一组与GCC非常相似的警告,它还具有启用它提供的每个警告的
-Weverything
选项。(如果GCC也有这样的东西就好了。)。这似乎是一个很好的证据,表明这些社区中没有人对您的代码实施过警告


我同意这看起来很有用,所以可能值得为GCC和/或clang提交一个功能请求(或者看看是否有人已经有了)。

我认为你做不到。额外的括号是告诉GCC它不应该警告分配的方式。如果它没有发出警告,它就不能将警告转化为错误,因为
-Werror
@Someprogrammerdude,不,我想要完全相反的结果:如果有人忘记在比较中添加第二个
=
,我希望GCC拒绝编译。它在语法和语义上都是有效的,因为赋值是一个表达式,条件可以是任何表达式。编译器不应该禁止这样的代码。正如你所提到的,这只是一个静态分析工具能够以你想要的方式处理的东西。@Someprogrammerdude但是额外的括号禁用你明确要求的警告的副作用是有害的@AndrewHenle为True,但另一方面,有时您希望在条件中执行赋值,然后不希望全局禁用它(在构建时使用标志)或使用编译器特定的杂注之类的杂注来混乱代码。