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