c - for 循环宏代码风格

标签 c loops macros 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

可以这样使用:

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他会喜欢人们如何浪费无数小时从他们的源代码中剔除字节......

但是您应该听从其他导师的建议,编写清晰明确的代码,仔细缩进和间隔,在重要的地方使用有意义的名称,在用途明显的地方使用简短的名称。尽可能使用惯用的结构,因为它使代码更易读、更不容易出错并且更适合优化编译器。

关于c - for 循环宏代码风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41090504/

相关文章:

C++ 芯片对计算问题

java - 循环执行速度控制

c - 整数到字符串转换器(使用宏)

c - 对于我的C作业,我不明白使用重定向来测试程序是什么意思?

c - 向nor flash发送命令

loops - 为什么我的使用 iteratee IO 的 Mapreduce 实现(真实世界的 Haskell)也失败并出现 "Too many open files"

c++ - 我可以重新定义一个 C++ 宏然后再定义它吗?

c++ - 如何在 C 中将字符串常量转换为预处理标记

c - 使用写入功能打印扩展的 ascii

c - 我无法将 stren 与指针一起使用