我在我的项目中看到了以下代码:
#define chk(_f) if ((status = _f) != 0) goto Error;
int init() {
int status = 0;
someStruct *s = NULL;
chk(someFunc1());
if (s = (someStruct)calloc(1, sizeof (*s)) == NULL) {
chk(1);
}
chk(someFunc2());
return 0;
Error :
if (s)
free(s);
return status;
}
一般来说goto,今天使用这样的设计是否可取?
为了不卷入宗教战争,我将仅举一个伪代码示例,其中使用goto(恕我直言)是非常合理的。驱动程序开发人员经常使用这种结构。所以:
这在哪里可以找到?好吧,为了不进入驱动程序,例如:
启动时,程序应进行以下检查:
对我来说似乎很清楚,鉴于所示的程序结构,使用goto不仅是可能的,而且是可取的。
谁不同意这一点-展示如何以不同方式描述这些嵌套条件以及程序变成什么样的噩梦。
当我问了一个类似的问题时,我在 goto 上听取了 Linus 通信的意见
在某些情况下使用
goto可能是合理的。包装goto在一个名称不明确的宏中 - 否 ( shoot )。goto在现代代码中很少使用(除非您正在编写需要适应有限内存的代码),因此建议明确每个此类转换。宏必须像宏一样命名 - 大写。如果它也隐藏在其中,
goto那么这个必须写在标题中,例如这样:如果宏
goto在外观上与常规函数没有区别,并且例如还包含在另一个文件中,那么这会引入不必要的混淆。宏应该尖叫它是一个宏,而不是一个函数,并且如果它里面有一些潜在的不安全的东西——比如
goto.最好不要做这样的事情(提醒你“如果你手里有一把锤子,那么一切都会变成钉子”):
最好明确说明
在这种特殊情况下,不。这里的宏
chk是一个脏宏实现asserthttps://ru.wikipedia.org/wiki/Assert.h 在Linux Kernel或Qt等世界项目中寻找检查值的方法