【发布时间】:2026-01-09 06:05:02
【问题描述】:
假设这些代码编译在g++:
#include <stdlib.h>
int main() {
int a =0;
goto exit;
int *b = NULL;
exit:
return 0;
}
g++ 会抛出错误:
goto_test.c:10:1: error: jump to label ‘exit’ [-fpermissive]
goto_test.c:6:10: error: from here [-fpermissive]
goto_test.c:8:10: error: crosses initialization of ‘int* b’
似乎goto 不能跨指针定义,但gcc 编译它们没问题,没有任何抱怨。
修复错误后,我们必须在任何goto语句之前声明所有指针,也就是说,即使你目前不需要这些指针,也必须声明这些指针(并且违反某些原则)。
g++ 禁止有用的 tail-goto 语句的起源设计考虑是什么?
更新:
goto 可以跨变量(任何类型的变量,不限于指针)声明,但获得初始化值的除外。如果我们删除上面的NULL 分配,g++ 现在保持沉默。所以如果你想声明goto-cross-area之间的变量,不要初始化它们(仍然违反一些原则)。
【问题讨论】:
-
这应该是 C 题还是 C++ 题?您的文件名为
.c,但您正在使用g++进行编译,这会强制使用 C++ 并生成特定于 C++ 的错误。有问题的错误是 C++ 特定的。