c++为什么我要用#define而不是inline
C++ why would I use #define rather than inline?
使用c++,何时我必须 #define
一个宏与inline
?本文详细阐述了为什么宏是邪恶的,为什么要使用宏?
我看到一个:
- 一些编译器不支持用loop 插入函数
其他?
还有,宏的常见用途是什么?通常,宏在什么情况下比其他实现选项具有特权?
'inline'只是对编译器的一个提示,它仍然可以拒绝在生成的代码中内联函数。
由于预处理宏只是替换,因此可以保证它是内联的,没有函数只是复制。
话虽如此,宏仍然是邪恶的,每种情况都应该被评估,而不是一个"通用规则",但如果你想要一个通用规则,总是倾向于内联而不是宏,或者相信编译器比你聪明,让它自己决定。
宏(#define
)由预处理器处理。它实际上只是一个简单的替换操作,不考虑语言语法,编译器甚至还没有看到源代码。如果宏观参数有副作用(如MACRO( x++ )
),则存在多次求值的问题。
函数由编译器处理。它提供了适当的类型检查和作用域,避免了多次求值问题,并且在出错时提供了更有意义的错误消息。
和你有没有曾经尝试通过一个"宏内联"函数使用调试器?
的功能…嗯…5-ish,宏0 .
现在,对于inline
关键字…如果你在这方面做得足够好,在决定什么应该内联和什么不应该内联方面胜过编译器,你就不会问这个问题了。即使您的在某个地方有性能问题,您也可以做比在某个地方添加inline
更有效的事情。
你总是可以用模板和内联代替预编译器宏。内联本身仅限于您指定的类型。只使用这种类型,不使用其他类型。使用模板,您可以利用不同的类型,并对任何将编译的内容使用相同的算法,并对某些类型进行专门化。宏的问题是,它可以多次求值表达式。模板不应该这样做,因为模板输入只对函数求值一次。
有些事情,比如使用STR(module)创建"module"字符串,只能使用宏。
至于内联和老式C宏的速度比较,我不知道。我认为它是非常特定于编译器的,你可以使用编译器标志来调整它。我从来没有玩过它,我只是倾向于相信最近的编译器足够聪明,可以真正内联可以内联的函数。事实上,在大多数情况下,内联关键字不应该被需要,因为编译器也可以内联没有这个关键字的函数。
- 激励'inline'说明符的真实世界示例?
- C++中的"inline"关键字
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- c中 #define 的不足
- 使用 [#define & #ifdef] 跨文件激活代码块
- 如何避免#define语法的变量重新声明
- c++为什么我要用#define而不是inline