使用 C++,我什么时候需要 #define
宏 vs inline
?这里的文章详细说明了为什么宏是邪恶的,为什么还要使用宏?
我看到一个:
- 一些编译器不支持 inling with functions with loop
任何其他?
此外,宏的常见用途是什么?一般来说,宏何时对其他实现选择具有特权?
'inline' 只是给编译器的一个提示,它仍然可以拒绝在生成的代码中内联函数。
由于预处理器宏只是替换,因此可以保证它将被内联,因此没有函数只是重复。
话虽如此,宏仍然是邪恶的,应该评估每种情况而不是“一般规则”,但是如果你想要一个一般规则总是更喜欢内联而不是宏,或者相信编译器比你更聪明,让它决定通过它自己。
宏 ( #define
) 由预处理器处理。它实际上只是一个简单的替换操作,不考虑语言语法,甚至在编译器查看源代码之前。如果宏参数有任何副作用(例如MACRO( x++ )
),则存在多重评估的问题。
函数由编译器处理。它提供了正确的类型检查和范围,避免了多重评估问题,如果你弄错了,它会提供更有意义的错误消息。
您是否曾经尝试过使用调试器单步执行“宏内联”函数?
那是功能......呃...... 5-ish,宏零。
现在,至于inline
关键字......如果你在这方面做得足够好,能够在决定什么应该内联和什么不应该内联方面击败编译器,你就不会问这个问题。即使你在某个地方遇到了性能问题,你也很有可能做比在inline
某个地方添加更有效的事情。
您始终可以用模板和内联替换预编译器宏。inline 本身仅限于您指定的类型。该类型被使用,没有别的。使用模板,您可以利用不同的类型并将相同的算法用于将编译的任何内容,并专门针对某些类型。宏的问题是,它可以多次评估表达式。模板永远不应该这样做,因为模板输入只针对功能评估一次。
有些事情,比如使用 STR(module) 制作“模块”字符串,只能使用宏来实现。
至于内联和旧式 C 宏之间的速度比较,我不知道。我认为它是非常特定于编译器的,您可以使用编译器标志对其进行大量调整。我从来没有玩过它,我只是倾向于相信最近的编译器足够聪明,可以真正内联可以内联的函数。事实上,在大多数情况下不需要 inline 关键字,因为编译器也可以内联没有此类关键字的函数。