已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。
3天前关闭。
Improve this question
我喜欢使用宏来使我的代码更快,特别是做一个从0到n的for循环。我是这样做的:
#define For(i,n) for(int i = 0; i < n; i++)
上面的代码运行良好,但我看到其他人这样做:
#define For(i,n) for(int i = 0; i < (n); i++)
唯一不同的是他们加了一个括号。我不知道他们为什么要添加(),我从编码器得到回复,它说目的是使它更安全。但是我没有得到他的进一步解释,我在网上也找不到相关的东西。
我只是尝试做嵌套循环,如果没有添加()就可以了。
当我使用宏很长一段时间的时候,我现在添加了(),它没有显示任何不同。
我对“更安全的程序”的确切含义很好奇,我想知道更多关于使用宏的风险(比如难以调试?)).
3条答案
按热度按时间j8yoct9x1#
它们可以使用表达式
n
,其中运算符precedence小于<
。逻辑被打破了,这个w/o括号是:
(i < a) ? 10 : 20
,它总是为真,并导致无限循环。ekqde3dh2#
如果你用了第一个
而且
你会得到
对吗?可能-取决于操作符的优先级,
总是正确的
t3psigkw3#
不要使用/定义此宏。宏继承自C,是许多难以理解和修复的问题的根源。
以下是此宏失败并中断不使用此宏的代码的示例:
假设你正在使用库,它有这样的东西(什么是有效的):
现在一切工作,直到在同一个翻译单元,你将包括这个库的头文件和你讨厌的宏。
突然这个宏破坏了你喜欢使用的库。
请注意,问题不在于如何使用宏(如其他答案),而在于它如何影响不相关的代码。
免责声明:这不是问题的答案(为什么需要括号),但这不适合作为评论。