首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环宏编码样式

问循环宏编码样式
EN

Stack Overflow用户
提问于 2016-12-11 19:55:09
回答 2查看 695关注 0票数 4

我在大学的一位导师建议使用宏来减少c99代码中的重复,如下所示。

代码语言:javascript
复制
#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

可以这样使用:

代码语言:javascript
复制
for_ij { /*do stuff*/; }
for_i  { /*do stuff*/; }

另一位有行业背景的家教则不鼓励使用它,声称这在他的前雇主看来是一种反模式(但他不知道背后的原因)。事实上,通过浏览大型项目的源代码,人们很少能在简短的学术示例之外找到这些构造。

我的问题是:为什么这种结构在实践中很少使用?在某种程度上是危险的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-11 23:42:01

这是学术界与现实世界之间差距的完美例证,令人难以相信。但它看起来太奇怪了,无法弥补。

要回答您的问题:NO这类构造是在实践中使用的而不是,而且使用隐式变量和条件隐藏信息是有风险的。

以下是一些读者会思考的问题:

  • 上限是多少?这并不是很明显,应该是n。
  • i的实际范围是多少?
  • 它是基于0的吗?
  • 它以前包括n还是stop?

C程序员非常擅长阅读惯用的构造,例如

代码语言:javascript
复制
for (int i = 0; i < n; i++) {
    ...
}

隐藏这个循环逻辑的细节不会保存任何东西,会产生反效果,容易出错,并且应该被本地编码约定所禁止。它不在我的团队里的唯一原因是没人想出这么奇怪的主意。

你可能需要谨慎对待那些希望使用这些缩写的大学导师,可能是APL怀旧,并避免冲突。你可能想和他玩一些代码高尔夫,有一个堆栈交换专用于此,他会喜欢人们如何浪费无数小时从他们的源代码刮胡子字节.

但你应该遵循另一位导师的建议,写清楚而明确的代码,仔细地缩进和间隔,在重要的地方写有意义的名字,在它们的使用明显的地方写简短的名字。在可能的情况下,倾向于惯用的构造,因为它使代码更易读、更容易出错,并且更适合于优化编译器。

票数 9
EN

Stack Overflow用户

发布于 2016-12-11 21:23:33

问题是,减少重复(从而提高可读性)是相当微不足道的。你在减少

代码语言:javascript
复制
for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)

至

代码语言:javascript
复制
for_ij

这并不是很大的改进,因为变量名称i、j和n都很短,所以重复它们不是问题。

同时,您隐藏参数n --后一个循环隐式地依赖于n,即使n在for_ij中没有出现,或者(很可能)出现在for循环的主体中。隐藏重要信息会使阅读代码更加困难--为了阅读这些信息,您需要了解n的关键重要性,您只能通过搜索两个级别的间接宏才能看到这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41090504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档