C定义语句函数调用一次或每次使用宏?

时间:2018-04-12 14:36:14

标签: c macros

在以下C代码中,此宏是否会将MIN_WORDS的所有实例替换为size_to_words(0),还是会被该函数调用的结果替换?

#define MIN_WORDS size_to_words(0)

我不希望每次都调用该函数的性能开销。

1 个答案:

答案 0 :(得分:3)

很好的问题,要了解发生了什么,你需要认识到这两件事。

  • 宏由预处理器解析
  • 在程序执行期间解析函数调用

将会发生以下情况:

  • 编译包含宏的代码时,预处理器 将首先用其定义替换所有宏。
  • 创建可执行文件时,将使用所有这些创建它 函数调用。在运行时,您将调用该函数 每一次。

如果使用优化标志进行编译,它可能会为您优化不必要的函数调用,请查看gcc -O3和-O2标志并查看它们的作用。

tl; dr:预处理器不会解析函数调用并优化代码,所以如果你的宏是一个函数,你的代码将调用函数,除非为你做了优化。