我在大学的一位导师建议使用宏来减少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*/; }另一位有行业背景的家教则不鼓励使用它,声称这在他的前雇主看来是一种反模式(但他不知道背后的原因)。事实上,通过浏览大型项目的源代码,人们很少能在简短的学术示例之外找到这些构造。
我的问题是:为什么这种结构在实践中很少使用?在某种程度上是危险的吗?
发布于 2016-12-11 23:42:01
这是学术界与现实世界之间差距的完美例证,令人难以相信。但它看起来太奇怪了,无法弥补。
要回答您的问题:NO这类构造是在实践中使用的而不是,而且使用隐式变量和条件隐藏信息是有风险的。
以下是一些读者会思考的问题:
n。i的实际范围是多少?0的吗?n还是stop?C程序员非常擅长阅读惯用的构造,例如
for (int i = 0; i < n; i++) {
...
}隐藏这个循环逻辑的细节不会保存任何东西,会产生反效果,容易出错,并且应该被本地编码约定所禁止。它不在我的团队里的唯一原因是没人想出这么奇怪的主意。
你可能需要谨慎对待那些希望使用这些缩写的大学导师,可能是APL怀旧,并避免冲突。你可能想和他玩一些代码高尔夫,有一个堆栈交换专用于此,他会喜欢人们如何浪费无数小时从他们的源代码刮胡子字节.
但你应该遵循另一位导师的建议,写清楚而明确的代码,仔细地缩进和间隔,在重要的地方写有意义的名字,在它们的使用明显的地方写简短的名字。在可能的情况下,倾向于惯用的构造,因为它使代码更易读、更容易出错,并且更适合于优化编译器。
发布于 2016-12-11 21:23:33
问题是,减少重复(从而提高可读性)是相当微不足道的。你在减少
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)至
for_ij这并不是很大的改进,因为变量名称i、j和n都很短,所以重复它们不是问题。
同时,您隐藏参数n --后一个循环隐式地依赖于n,即使n在for_ij中没有出现,或者(很可能)出现在for循环的主体中。隐藏重要信息会使阅读代码更加困难--为了阅读这些信息,您需要了解n的关键重要性,您只能通过搜索两个级别的间接宏才能看到这一点。
https://stackoverflow.com/questions/41090504
复制相似问题