在许多其他情况下,gcc似乎能够检测到循环开始时的条件初始化了变量。如果我删除了增量运算符,它甚至可以工作。如果没有-02
标志,它也会消失。我已经学会相信,编译器警告通常确实意味着出了点问题,所以我想知道是否缺少某些内容,或者这仅仅是一个奇怪的编译器怪癖。
void act(char **);
void test(int width, int height){
char * rowA[width];
char ** A;
for (int i = 0; i < width * height; ++i){
if (!(i % width)){
if (i){
act(rowA);
}
rowA[0] = 0;
A = rowA;
}
*A++ = "hello";
}
}
使用gcc-6.3.0
在-Wall -Werror -02
上编译
编辑:为避免混淆,我将代码更改为更接近实际用例。
答案 0 :(得分:2)
警告表示编译器无法证明变量始终在使用前进行了初始化。
当然,此警告不能完全准确,它会引起警告,如果不能确定,则会发出警告。使用此警告时,通常会遇到这种情况,您必须修改正确的代码才能消除该警告。
可能也是优化程序错误的证据;优化程序应该意识到if(!(i % argc))
可以优化为if (i == 0)
。