0

使用 C++,我什么时候需要 #define宏 vs inline这里的文章详细说明了为什么宏是邪恶的,为什么还要使用宏?

我看到一个:

  • 一些编译器不支持 inling with functions with loop

任何其他?

此外,宏的常见用途是什么?一般来说,宏何时对其他实现选择具有特权?

4

3 回答 3

3

'inline' 只是给编译器的一个提示,它仍然可以拒绝在生成的代码中内联函数。

由于预处理器宏只是替换,因此可以保证它将被内联,因此没有函数只是重复。

话虽如此,宏仍然是邪恶的,应该评估每种情况而不是“一般规则”,但是如果你想要一个一般规则总是更喜欢内联而不是宏,或者相信编译器比你更聪明,让它决定通过它自己。

于 2013-03-20T12:22:45.833 回答
1

宏 ( #define) 由预处理器处理。它实际上只是一个简单的替换操作,不考虑语言语法,甚至在编译器查看源代码之前。如果宏参数有任何副作用(例如MACRO( x++ )),则存在多重评估的问题。

函数由编译器处理。它提供了正确的类型检查和范围,避免了多重评估问题,如果你弄错了,它会提供更有意义的错误消息。

是否曾经尝试过使用调试器单步执行“宏内联”函数?

那是功能......呃...... 5-ish,宏零。

现在,至于inline关键字......如果你在这方面做得足够好,能够在决定什么应该内联和什么不应该内联方面击败编译器,你就不会问这个问题。即使你在某个地方遇到了性能问题,你也很有可能做比在inline某个地方添加更有效的事情。

于 2013-03-20T12:55:07.713 回答
0

您始终可以用模板和内联替换预编译器宏。inline 本身仅限于您指定的类型。该类型被使用,没有别的。使用模板,您可以利用不同的类型并将相同的算法用于将编译的任何内容,并专门针对某些类型。宏的问题是,它可以多次评估表达式。模板永远不应该这样做,因为模板输入只针对功能评估一次。

有些事情,比如使用 STR(module) 制作“模块”字符串,只能使用宏来实现。

至于内联和旧式 C 宏之间的速度比较,我不知道。我认为它是非常特定于编译器的,您可以使用编译器标志对其进行大量调整。我从来没有玩过它,我只是倾向于相信最近的编译器足够聪明,可以真正内联可以内联的函数。事实上,在大多数情况下不需要 inline 关键字,因为编译器也可以内联没有此类关键字的函数。

于 2013-03-20T12:29:48.760 回答