假设这些代码在 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
跨区域之间声明变量,则不要对它们进行初始化(并且仍然违反一些原则)。
.c
,但你正在使用g++
编译,这会强制使用C++并生成特定于C++的错误。所涉及的错误是C++特定的。 - AnT stands with Russia