在C++中哪里以及为什么使用预处理器宏和指令?[副本]

zpgglvta  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(124)

此问题已在此处有答案

Why are preprocessor macros evil and what are the alternatives?(8个回答)
3天前关闭。
在一个教程中,我看到他们使用预处理器指令来定义宏。为什么我应该使用宏而不是普通函数。

// Why should I use this
#define GROW_CAPACITY(capacity) \
    ((capacity) < 8 ? 8 : (capacity) * 2)

// Instead of this
int GROW_CAPACITY(int capacity) {
  return capacity < 8 ? 8 : capacity * 2
}
kmbjn2e3

kmbjn2e31#

在过去,CPU以MHz为单位,RAM以Kb为单位,宏总是内联到代码中,使其成为简单可读代码的简单简写 *,没有开销 *。在那些日子里,函数调用的成本比你预期或想要的要高,甚至在紧密的循环中也很明显。在非常低功率的设备中,这可能仍然是真的。
如今,CPU速度如此之快,编译器可以做更多的事情来优化函数,第二个函数将是内联的(或者不是,编译器将知道什么时候是最好的),所以没有理由不使用该函数。这也许就是宏不再流行的原因。
但是,如果使用得当,它们仍然可以使代码更具可读性。即使在没有预处理器的编译器中,你仍然可以看到像#if DEBUG这样的功能,因为这种宏非常强大,而且开销为零。

new9mtju

new9mtju2#

两个基本原则是:

  • 如果可能,使用constexpr函数或变量,
  • 如果没有必要,不要使用宏。

你应该遵循这些准则。

相关问题