【发布时间】:2021-03-02 21:14:53
【问题描述】:
带有goto 错误处理程序的简单函数:
void checkFile(char *name)
{
FILE *fp = fopen(name, "r");
if(NULL == fp)
{
fprintf(stderr, "Could not open %s\n", name);
goto end;
}
// use fp...
fclose(fp);
end:
;
}
注意,如果我删除end: 后面的无用分号,函数将无法编译。
在 GCC 上:
error: expected primary-expression before '}' token
16 | }
在 MSVC 上:
error C2143: syntax error: missing ';' before '}'
所以,我知道 C 标准确实说 goto 关键字的目标需要在 § 6.8.6.1 p 2 中声明:
goto 语句会导致无条件跳转到由封闭函数中的命名标签前缀的语句
但是,错误的存在只是因为标签存在;如果我删除 goto 关键字,标签本身仍被视为错误并且不会编译。我阅读了标准中关于“标签声明”的部分(第 6.8.1 节),但仍然没有找到任何可以解释这种奇怪约束的内容。
【问题讨论】:
-
所以它需要一个声明。
;是一个空语句。没有它就没有声明。 -
end: {}也是一个语句,不需要分号:-) -
Re “所以,我知道 C 标准确实说 goto 关键字的目标需要一个语句”:那么你的问题是什么?既然您知道
goto指向以标签为前缀的语句,那么您为什么对标签必须有语句感到惊讶? -
呃。让我猜猜:您有一些限制性的代码标准,阻止您在失败后立即执行
return,而必须使用goto。编写这个短视要求的人完全无法理解您为什么首先要编写代码标准:使代码始终更具可读性。强制使用goto使该测试失败。这就像奥运跳水运动员在比赛中做炮弹一样。