|
发表于 2016-10-12 13:33:15
|
显示全部楼层
开个玩笑。。。
如果只是为了避免使用goto而使用do...各种break...while(0),那么用switch语句也可以实现:
- fun(...)
- {
- FILE * fp1 = NULL;
- FILE * fp2 = NULL;
- void * hdr = NULL;
-
- switch(0)
- {
- default:
-
- fp1 = fopen("file1","rb");
- if(fp1 == NULL) break;
-
- fp2 = fopen("file2","wb");
- if(fp2 == NULL) break;
-
- hdr = ModuleCreate(...);
- if(hdr == NULL) break;
-
- //TODO
- ...
- //Done
- break;
- }
- //exit function
- if(fp1 != NULL) fclose(fp1);
- if(fp2 != NULL) fclose(fp2);
- if(hdr != NULL) ModuleDestroy(hdr);
- }
复制代码
很别扭吧?
用goto:
- fun(...)
- {
- FILE * fp1 = NULL;
- FILE * fp2 = NULL;
- void * hdr = NULL;
-
- fp1 = fopen("file1","rb");
- if(fp1 == NULL) goto exit_function;
-
- fp2 = fopen("file2","wb");
- if(fp2 == NULL) goto exit_function;
-
- hdr = ModuleCreate(...);
- if(hdr == NULL) goto exit_function;
-
- //TODO
- ...
- //Done
-
- exit_function:
- if(fp1 != NULL) fclose(fp1);
- if(fp2 != NULL) fclose(fp2);
- if(hdr != NULL) ModuleDestroy(hdr);
- }
复制代码
goto就是用来跳转的,一目了然。
如果实在觉得goto碍眼,可以这样:
- #define FUNC_EXIT(label) {goto label;}
- fun(...)
- {
- FILE * fp1 = NULL;
- FILE * fp2 = NULL;
- void * hdr = NULL;
-
- fp1 = fopen("file1","rb");
- if(fp1 == NULL) FUNC_EXIT(exit_function);
-
- fp2 = fopen("file2","wb");
- if(fp2 == NULL) FUNC_EXIT(exit_function);
-
- hdr = ModuleCreate(...);
- if(hdr == NULL) FUNC_EXIT(exit_function);
-
- //TODO
- ...
- //Done
-
- exit_function:
- if(fp1 != NULL) fclose(fp1);
- if(fp2 != NULL) fclose(fp2);
- if(hdr != NULL) ModuleDestroy(hdr);
- }
复制代码 |
|