使用宏在C中创建循环

asc*_*bol 4 c macros

在查看一些遗留代码时,我发现了一个相当不寻常的结构(至少对我来说):

#define loop(i,start,stop) for((i)=(start);(i)<(stop);(i)++)
Run Code Online (Sandbox Code Playgroud)

然后在任何地方使用此宏而不是常规循环构造.

我认为一般来说这是一个坏主意,因为它并没有真正解决问题,也没有简化任何事情,但这可能是危险的吗?危险我的意思是打破编译(最好的情况)或(更糟糕但更有趣)做其他事情而不是预期.

Mar*_*tos 6

针对宏的标准警示故事是带有副作用的参数:

loop(i, x, y++)
Run Code Online (Sandbox Code Playgroud)

  • 我的观点依旧.宏是危险的,功能不是.如果你仔细使用它们,对你有好处.使用它们时必须小心,这意味着它们很危险.把它们称为其他任何东西只是分裂头发. (3认同)
  • 在`free(NULL)`上失败的`free`的实现并不危险; 它坏了.C标准要求对"free(NULL)"的调用不起作用.宏看起来像函数,但不像它们那样.这导致难以发现的细微错误; 因此它们是危险的,就像手榴弹是一种危险的装置,无论人们如何小心处理它.比较,例如,C宏`max`到C++内联函数`max`. (2认同)