在查看一些遗留代码时,我发现了一个相当不寻常的结构(至少对我来说):
#define loop(i,start,stop) for((i)=(start);(i)<(stop);(i)++)
然后在任何地方使用此宏,而不是常规用于循环构造。
我认为一般来说这是一个坏主意,因为它并没有真正解决问题,也没有简化任何事情,但它可以危险吗? 危险我的意思是打破编译(最好的情况)或(更糟糕但更有趣)做其他事情而不是预期。
答案 0 :(得分:6)
针对宏的标准警示故事是带有副作用的论据:
loop(i, x, y++)
答案 1 :(得分:2)
虽然,我不建议这样做,因为它使代码混乱,可读性较低(没有实际简化),技术上没有任何错误。如果使用正确,则不应导致任何问题或意外行为。当然,如果在其中一个答案中提到了奇怪的论点,那么就会出现问题。
答案 2 :(得分:1)
危险并不可能,但如果使用不当,它可以做一些不同于你期望的事情。问题是宏正在进行TEXT替换 - 他们可以在解析器看到之前对代码进行操作。这意味着如果你在'i'中做了一些有副作用的事情,那么无论你做了什么都会被复制3次,这可能不是你想要的。
如果你总是将它与简单变量一起使用,它将始终正常工作,但如果你变得复杂,你最好小心。
我个人不会使用它,因为我同意它不会简化任何事情。
答案 3 :(得分:0)
也许应该避免它,因为我们在使用之前必须考虑三次潜在的副作用。下一个程序员也将致力于该代码......