【发布时间】:2016-12-11 19:55:09
【问题描述】:
我在大学的一位导师建议使用宏来减少 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*/; }
另一位具有工业背景的导师不鼓励使用它,声称它被他的前雇主视为一种反模式(但他不知道这背后的原因)。事实上,通过搜索大型项目的源代码,人们很少会在简短的学术示例之外找到这些结构。
我的问题是:为什么这种结构在实践中很少使用?是不是有点危险?
【问题讨论】:
-
您实际上是在使用预处理器创建自己的方言。 Doig so 总是充满危险,并阻碍对任何其他人(或以后的你自己)的理解。无论如何,这是Software Engineering 的更多问题,而不是SO。
-
打个比方,想象一本书的序言指出“SR”将取代“罗伯特说”,“TND”将取代“第二天”。您可以阅读它,但至少可以说很奇怪
-
当我学习 C 时(很久以前),我比你的第一位导师聪明,并且做到了
#define forloop for (int i = 0; i < n; i++) {。通过将{添加到宏中,我节省了更多重复!现代文本编辑器对不平衡的大括号并不满意,但在过去的美好时光这不是问题...... -
听第二位导师——有工业背景的。他的建议更明智,IMNSHO。这种宏很少使用,因为节省的输入量不足以保证增加混淆选项。
标签: c loops macros c-preprocessor