Error: jump to label 'failed' [-fpermissive], GCC vs VS

Error: jump to label 'failed' [-fpermissive], GCC vs VS

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

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

compile_problems

这是添加的代码:

    /* 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;
    }
}

我觉得还不错。这是添加到我们原始文件中的唯一内容。完整的文件在这里: goto Line 59 of image_data.cc

以及炸毁的函数: image_data_c *PNG_Load(file_c *f, int read_flags)

我不明白会发生什么,因为这之前工作得很好,并且从未遇到过交叉初始化或我们的案例处理问题。

如果能得到一些帮助,我将不胜感激!


错误看起来很清楚:从 int num_unknowns 的初始化之前到它之后都有到标签 failed: 的跳转,因此 int 将具有垃圾值。这在 C++ 中是被禁止的(但在 C 中不是)。

一种解决方案是将

int num_unknowns = 0;

在函数的开头,将您发布的代码示例的第三行更改为对 num_unknowns.

的赋值

另一种解决方案是使用 -fpermissive 选项指示 GCC 允许这样做,正如错误本身所指示的那样。