我使用的是gcc-4.7 (Ubuntu/Linaro 4.7.2-11precise2) 4.7.2
,遇到了一个非常奇怪的问题。我无法编译下面这个有效的代码,却收到了警告:
extern void dostuff(void);
int test(int arg1, int arg2)
{
int ret;
if (arg1) ret = arg2 ? 1 : 2;
dostuff();
if (arg1) return ret;
return 0;
}
编译选项和输出:
$ gcc-4.7 -o test.o -c -Os test.c -Wall
test.c: In function ‘test’:
test.c:5:6: warning: ‘ret’ may be used uninitialized in this function [-Wmaybe-uninitialized]
然而,以下代码编译时没有警告(尽管会生成略微不太高效的汇编代码):
extern void dostuff(void);
int test(int arg1, int arg2)
{
int ret;
if (arg1 && arg2) ret = 1;
if (arg1 && !arg2) ret = 2;
dostuff();
if (arg1) return ret;
return 0;
}
我有点卡住了,正在考虑这可能是编译器的bug。你有什么想法吗?
ret == arg2 ? 1 : 2;
吗? - Alok Savearg1=0,arg2=0
,则返回0;如果arg1=1,arg2=1
,则返回1;如果arg1=1,arg2=0
,则返回2。这段代码只是我遇到的一个更大问题的简化情况。 - user593062ret
是一个大数组,如果没有使用它,我不想初始化它。看看我的第一个程序,ret
确实从未被未初始化使用,所以警告是不正确的,对吧? - user593062ret
,或者它不会初始化,但也永远不会使用ret
。你的反对是不正确的,如上所示的代码肯定不会在初始化之前访问ret
,不需要显式地进行零初始化,如果编译器声称其他任何东西,那么它就是有问题的。 - Mecki