使用宏在C中创建循环

使用宏在C中创建循环,c,macros,C,Macros,在查看一些遗留代码时,我发现了一个相当不寻常的结构(至少对我来说): #为((i)=(start);(i)定义循环(i,开始,停止);(i)针对宏的标准警告故事是具有副作用的参数: loop(i, x, y++) 然而,我不建议这样做,因为这样会使代码变得混乱,可读性降低(实际上不会简化事情),从技术上讲,它没有什么问题。如果使用正确,它不会导致任何问题或意外行为。当然,如果像其他答案中提到的那样给出奇怪的论点,就会出现问题。它不太可能有危险,但如果使用不当,它可能会做一些超出您预期的事情宏正

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


#为((i)=(start);(i)定义循环(i,开始,停止);(i)针对宏的标准警告故事是具有副作用的参数:

loop(i, x, y++)

然而,我不建议这样做,因为这样会使代码变得混乱,可读性降低(实际上不会简化事情),从技术上讲,它没有什么问题。如果使用正确,它不会导致任何问题或意外行为。当然,如果像其他答案中提到的那样给出奇怪的论点,就会出现问题。

它不太可能有危险,但如果使用不当,它可能会做一些超出您预期的事情宏正在进行文本替换——在解析器看到代码之前,宏必须先对代码进行测试。这意味着,如果您在“i”中做了一些有副作用的事情,那么您所做的任何事情都将被复制3次,而这可能不是您想要的

如果你总是使用简单的变量,它总是正确的工作,但如果你变得复杂,你最好小心


我个人不会使用它,因为我同意它不会简化任何事情。

也许应该避免使用它,因为我们在使用它之前必须仔细考虑潜在的副作用。下一个开发该代码的程序员也会这样做…

也许,但这只是强调了宏是危险的原始前提
free
free(NULL)
上失败的操作并不危险;它被破坏了。C标准要求调用
free(NULL)“宏”看起来像是函数,但不象它们那样。这会导致难以察觉的细微错误;因此,它们是危险的,就像手榴弹是危险的设备一样,不管它们是如何小心处理的。例如,将C宏代码> max <代码>与C++内联函数<代码> max < /代码进行比较。>。我的观点是。宏在某些方面是危险的,而函数却不是。如果你小心使用宏,那对你有好处。使用宏时必须小心这一事实意味着它们是危险的。把它们称为其他任何东西都是令人毛骨悚然的。@ShinTakezou:任何东西都可以被归类为不危险,只要不考虑这些危险。你是b吃一匹死马。@ShinTakezou:你说得对。任何一个非琐碎的主题都允许多个PoV。一些人嘲笑手榴弹是危险的概念,认为如果你尊重安全操作的规则,一切都是好的。然而,大多数人会说,任何旨在将你炸成碎片的物体都是危险的。在我的PoV中,一个经验有经验、负责任的程序员认为宏是危险的,并在可行的情况下避免使用宏。显然,宏没有手榴弹那么明确,所以你有权获得你的PoV。但我还要补充一点,从我的PoV来看,你的PoV会带来很多痛苦。如果有人编写
循环
函数,他也不会高兴。
loop(i, x, y++)