for循环宏编码风格

use*_*888 4 c macros loops c-preprocessor

我在大学的一位导师建议使用宏来减少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
Run Code Online (Sandbox Code Playgroud)

哪个可以这样使用:

for_ij { /*do stuff*/; }
for_i  { /*do stuff*/; }
Run Code Online (Sandbox Code Playgroud)

另一位具有工业背景的导师不鼓励使用它,声称它在他的前雇主身上被视为一种反模式(但他不知道背后的原因).实际上,通过浏览大型项目的源代码,很少能够在简短的学术范例之外找到这些结构.

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

chq*_*lie 8

这是学术界和现实世界之间差距的完美例证,很难相信.但是看起来太奇怪了.

要回答你的问题:NO这样的结构是不是在实践中使用,这是有风险的,因为它隐藏的信息,使用隐式变量和条件.

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

  • 什么是上限?应该不是那么明显n.
  • 实际范围是i多少?
  • 它是0基于?
  • 它包括n或停止之前?

C程序员非常擅长阅读诸如此类的惯用结构

for (int i = 0; i < n; i++) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

隐藏此循环逻辑的详细信息不会产生任何影响,会产生反效果,容易出错,并且应该被本地编码约定取缔.它不在我的团队中的唯一原因是没有人想出这么奇怪的想法.

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

但你应该遵循其他导师的建议,编写清晰明确的代码,仔细缩进和间隔,在有意义的名称和重要的名称中使用很明显.尽可能使用惯用结构,因为它使代码更易读,更不容易出错,更适合优化编译器.