我大学的一位导师建议使用宏来减少C99代码中的重复,就像这样。

#define foreach(a, b, c) for (int a = b; a < c; a++)
#define for_i foreach(i, 0, n)
#define for_j foreach(j, 0, n)
#define for_ij for_i for_j

可以这样使用:
for_ij { /*do stuff*/; }
for_i  { /*do stuff*/; }

另一位有工业背景的导师不赞成使用这种方法,声称在他以前的雇主那里,这种方法被视为一种反模式(但他不知道背后的原因)。事实上,通过修改大型项目的源代码,人们很少能在简短的学术示例之外找到这些结构。
我的问题是:为什么这个结构在实践中很少使用?在某种程度上有危险吗?

最佳答案

这是学术界与现实世界差距的完美写照,令人难以置信。但这看起来太奇怪了,无法弥补。
回答你的问题:没有这种结构在实践中没有被使用,它是有风险的,因为它使用隐式变量和条件来隐藏信息。
下面是一些读者会思考的问题:
上限是多少?不太明显,应该是n
i的实际范围是多少?
它是基于0的?
是否包括n或之前停止?
C程序员非常擅长阅读惯用结构,如

for (int i = 0; i < n; i++) {
    ...
}

隐藏这个循环逻辑的细节不会节省任何东西,会产生反效果,容易出错,应该被本地编码惯例禁止。在我的团队里没有的唯一原因是没人想出这么奇怪的主意。
你可能需要谨慎对待希望使用这些缩写的大学导师,可能是一个APL怀旧,并避免冲突。你可能想和他玩一些code golfing,有一个stack exchange dedicated to that,他会喜欢人们如何浪费无数小时从他们的源代码刮字节…
但你应该听从另一位导师的建议,写出清晰明确的代码,小心地缩进和隔开,重要的地方用有意义的名字,明显的地方用简短的名字。尽可能使用惯用结构,因为它使代码更可读、更不容易出错,更适合优化编译器。

10-01 20:11
查看更多