c++为什么我要用#define而不是inline

C++ why would I use #define rather than inline?

本文关键字:inline #define 为什么 我要 c++      更新时间:2023-10-16

使用c++,何时我必须 #define一个宏与inline ?本文详细阐述了为什么宏是邪恶的,为什么要使用宏?

我看到一个:

  • 一些编译器不支持用loop
  • 插入函数

其他?

还有,宏的常见用途是什么?通常,宏在什么情况下比其他实现选项具有特权?

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

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

话虽如此,宏仍然是邪恶的,每种情况都应该被评估,而不是一个"通用规则",但如果你想要一个通用规则,总是倾向于内联而不是宏,或者相信编译器比你聪明,让它自己决定。

宏(#define)由预处理器处理。它实际上只是一个简单的替换操作,不考虑语言语法,编译器甚至还没有看到源代码。如果宏观参数有副作用(如MACRO( x++ )),则存在多次求值的问题。

函数由编译器处理。它提供了适当的类型检查和作用域,避免了多次求值问题,并且在出错时提供了更有意义的错误消息。

和你有没有曾经尝试通过一个"宏内联"函数使用调试器?

的功能…嗯…5-ish,宏0 .

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

你总是可以用模板和内联代替预编译器宏。内联本身仅限于您指定的类型。只使用这种类型,不使用其他类型。使用模板,您可以利用不同的类型,并对任何将编译的内容使用相同的算法,并对某些类型进行专门化。宏的问题是,它可以多次求值表达式。模板不应该这样做,因为模板输入只对函数求值一次。

有些事情,比如使用STR(module)创建"module"字符串,只能使用宏。

至于内联和老式C宏的速度比较,我不知道。我认为它是非常特定于编译器的,你可以使用编译器标志来调整它。我从来没有玩过它,我只是倾向于相信最近的编译器足够聪明,可以真正内联可以内联的函数。事实上,在大多数情况下,内联关键字不应该被需要,因为编译器也可以内联没有这个关键字的函数。