C++;为什么我要使用#define而不是inline? C++,当i 必须< >代码>定义< /代码>宏vs>代码>内联< /代码>阐述了为什么宏是邪恶的,为什么还要使用宏

C++;为什么我要使用#define而不是inline? C++,当i 必须< >代码>定义< /代码>宏vs>代码>内联< /代码>阐述了为什么宏是邪恶的,为什么还要使用宏,c++,macros,inline,C++,Macros,Inline,我看到一个: 有些编译器不支持使用带有循环的函数进行内联 还有别的吗 此外,宏的常见用途是什么?通常,宏在其他实现选项上具有特权吗?'inline'只是对编译器的一个提示,它仍然可以拒绝在生成的代码中内联函数 因为预处理器宏只是一个替换,所以可以保证它是内联的,没有函数只是复制 也就是说,宏仍然是邪恶的,每种情况都应该被评估,而不是“一般规则”,但是如果你想让一般规则总是喜欢内联而不是宏,或者相信编译器比你聪明,让它自己决定。'inline'只是对编译器的一个提示,它仍然可以拒绝在生成的代码

我看到一个:

  • 有些编译器不支持使用带有循环的函数进行内联
还有别的吗


此外,宏的常见用途是什么?通常,宏在其他实现选项上具有特权吗?

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

因为预处理器宏只是一个替换,所以可以保证它是内联的,没有函数只是复制


也就是说,宏仍然是邪恶的,每种情况都应该被评估,而不是“一般规则”,但是如果你想让一般规则总是喜欢内联而不是宏,或者相信编译器比你聪明,让它自己决定。

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

因为预处理器宏只是一个替换,所以可以保证它是内联的,没有函数只是复制


也就是说,宏仍然是邪恶的,每种情况都应该进行评估,而不是“一般规则”,但如果您希望使用一般规则,则始终更喜欢内联而不是宏,或者相信编译器比您更聪明,让它自己决定。

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

有些事情,比如使用STR(module)生成“module”字符串,只能使用宏


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

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

有些事情,比如使用STR(module)生成“module”字符串,只能使用宏

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

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

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

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

这就是功能。。。UH5-ish,宏零

现在,对于
inline
关键字。。。如果您在这方面做得足够好,能够在决定哪些应该内联,哪些不应该内联方面击败编译器,那么您就不会问这个问题了。即使在某个地方出现性能问题,也很有可能比在某个地方添加
内联
更有效。

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

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

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

这就是功能。。。UH5-ish,宏零


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

什么是
#内联
?他肯定是指
内联
关键字。问题是关于
#定义(…)
内联
。从问题的质量来看,他不应该使用这两种方法,而是应该相信自己的编译器优化能够做出比自己更明智的选择。(对不起)@DevSolar谢谢你的建设性回答。这是关于#的