我试图在不使用exit()
的情况下退出程序。我想出了一个非常复杂和肮脏的解决方案(我是初学者)。
我想使用if
语句,如果是,那么我想使用goto
去主函数然后return 3;
并结束程序。
以下是一些代码:
FILE *filepointer;
char * line = NULL;
size_t len = 0;
size_t read;
int linecount = 0;
filepointer = fopen(filename, "r");
if (filepointer == NULL)
{
printf("[ERR] Could not read file %s.\n",filename );
goto FILE_ERROR;
}
...
int main(){
...
FILE_ERROR: return 3;
}
但这不起作用,因为我无法在函数之间跳转,因为我将undeclared Label
视为错误。我有什么方法可以从我的程序中排除exit()
并仍然返回它返回某个值。如果有更好的解决方案,请告诉我
答案 0 :(得分:4)
这个问题唯一的好答案是:不要做。以这种方式使用goto
会使您的代码很难推理。
重构您的代码,以便您拥有清晰的结构和调用层次结构。使用返回值在整个调用堆栈中传播成功/失败。
答案 1 :(得分:2)
goto
不能用于跳过不同的功能;它只能在同一个功能中使用。要在功能之间跳转,您可以查看setjmp()
和longjmp()
功能。
话虽如此,既然你声称自己是初学者,我不相信你真的需要使用上述任何一种。您只需修改函数即可返回“错误”值。在main()
中,检查其值并从main()
返回错误值。
答案 2 :(得分:0)
按照设计,goto
无法从一个函数跳转到另一个函数。它只能用于在给定函数内跳转。
有很多方法可以在功能之间跳转,但这样做不仅设计很差,而且很危险,因为很容易将程序置于无效状态。
处理此问题的正确方法是让函数返回特定值(或一组值)以指示错误。然后调用函数将检查其中一个错误值并采取相应的行动。
例如:
int readFile(char *filename)
{
FILE *filepointer;
char * line = NULL;
size_t len = 0;
size_t read;
int linecount = 0;
filepointer = fopen(filename, "r");
if (filepointer == NULL)
{
// add strerror(error) to the error message to know why fopen failed
printf("[ERR] Could not read file %s: %s.\n",filename, strerror(errno) );
// error completion
return 0;
}
...
// successful completion
return 1;
}
int main(){
...
if (readFile("myfile") == 0) {
return 3;
}
...
}
答案 3 :(得分:0)
如果您想使用go-to并坚持要这样做,您可以尝试扩展您的第一个函数,使其包含/封装第二个函数,并完全摆脱第二个函数,因此您可以在更大的函数中执行转到和子例程。
这是您可以尝试的选择吗? (如果您无法使用Goto,)?
我愿意。