混合内联和宏功能

时间:2017-08-20 13:46:18

标签: c++ macros inline

我决定尝试一下。我知道宏是邪恶的,应该避免,但想看看如果我做这样的话会发生什么。

#include <iostream>
using namespace std;
inline void add(int x, int y) { cout << "Inline: " << x + y << endl; }
#define add(x,y) ( cout << "Macro: " << x + y << endl )

int main()
{
    add(3,5);
}

输出:

Macro: 8

如果我注释掉#define内联线开始工作,输出变为Inline: 8

我的问题是,为什么编译器决定使用宏函数而不是内联。谢谢!

  

我使用Linux Mint 18.2g++ 5.4.0,没有参数g++ -g t2.cpp -o t2

3 个答案:

答案 0 :(得分:5)

在编译之前,通过预处理器执行宏替换。因此编译器永远不会看到add(3,5) - 它只能看到宏扩展。

答案 1 :(得分:2)

宏在定义的位置生效,因此内联函数被宏替换,但您的调用在编译之前被替换。另请注意,宏是一个函数,它告诉预处理器一种替换文本的模式。

您可以运行以下命令并查看输出文件(your.i

g++ -o your.i -E your.cpp
               ^         

你会发现内联函数不受宏影响:)

G ++的选项-E表示“预处理源文件,但不编译,不汇编而不链接”。

答案 2 :(得分:2)

没有&#34;宏功能&#34;这样的东西。编译器(实际上是预处理器)只需将main转换为

int main()
{
    ( cout << "Macro: " << 3 + 5 << endl );
}