Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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
C++ 错误:跳转到标签';失败';[-F允许]、GCC与vs_C++_Gcc_Png - Fatal编程技术网

C++ 错误:跳转到标签';失败';[-F允许]、GCC与vs

C++ 错误:跳转到标签';失败';[-F允许]、GCC与vs,c++,gcc,png,C++,Gcc,Png,我们在游戏引擎的PNG解码例程中添加了一些新代码。定义的附加块只是用来读取一些值——没什么大不了的 在VisualC++中,编译得很好。在我们主要使用的GCC上,我们现在遇到了一个以前从未发生过的奇怪问题: 这是添加的代码: /* read grAb chunk */ png_unknown_chunk *unknowns; int num_unknowns = png_get_unknown_chunks(png_ptr, info_ptr, &unknowns); for

我们在游戏引擎的PNG解码例程中添加了一些新代码。定义的附加块只是用来读取一些值——没什么大不了的

在VisualC++中,编译得很好。在我们主要使用的GCC上,我们现在遇到了一个以前从未发生过的奇怪问题:

这是添加的代码:

    /* read grAb chunk */
png_unknown_chunk *unknowns;
int num_unknowns = png_get_unknown_chunks(png_ptr, info_ptr, &unknowns);

for (int i = 0; i < num_unknowns; i++)
{
    if (!memcmp(unknowns[i].name, "grAb", 4))
    {
        png_grAb_t *grAb = reinterpret_cast<png_grAb_t *>(unknowns[i].data);
        grAb->x = EPI_BE_S32(grAb->x) + 160 - width / 2;
        grAb->y = EPI_BE_S32(grAb->y) + 200 - 32 - height;
        img->grAb = grAb;
        break;
    }
}
/*读取抓取块*/
png_unknown_chunk*未知数;
int num_unknowns=png_get_unknown_块(png_ptr、info_ptr和unknowns);
for(int i=0;ix=EPI\U BE\U S32(抓斗->x)+160-宽度/2;
抓斗->y=EPI\U BE\U S32(抓斗->y)+200-32-高度;
img->grAb=抓取;
打破
}
}
我觉得很好。这是唯一添加到原始文件中的内容。完整文件如下:

还有这个炸弹爆炸出来的功能: 图像数据加载(文件读取标志)

我不明白会发生什么,因为这在以前工作得非常好,而且在交叉初始化或我们的案例处理方面从来没有问题

如果我能得到一些帮助,我将非常感激



错误似乎非常清楚:从初始化
int num\u unknowns
之前到之后,有跳转到标签
失败:
,因此int将有垃圾值。在C++中是禁止的(但在C中)。< /P> 一个解决办法是

int num_unknowns = 0;
在函数的开头,将您发布的代码示例的第三行更改为仅分配给
num\u unknowns


另一个解决方案是指示GCC允许此操作,使用
-fpPermissive
选项,正如错误本身所示。

请在问题本身中发布。我也这么认为,但奇怪的是,VS并没有用它来炸开,而GCC却…:太棒了,[0,2]编译器中的某些东西是正确的。如果没有MCVE,就无法判断。虽然您的解决方案会消除警告,但您无法证明生成的代码是正确的,并在所有相关平台上产生所需的行为。@Baum:显然,他们已经跳过了大量的赋值,但他们的所有初始化都位于函数顶部,以允许跳转。然后他们添加了一个新变量,但忘记在函数顶部声明它。那么,就这样做吧。很明显,它与更改之前的一样正确,并且鉴于它的名称,我不认为
failed
块将假定函数中的所有赋值都是成功的,因此这甚至不是对
goto
的误用。