混合内联和宏函数

Mixing inline and macro functions

本文关键字:函数 混合      更新时间:2023-10-16

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

#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

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

没有"宏函数"这样的东西。编译器(实际上是预处理器(只是将main变成

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

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

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

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

您会发现内联功能不受宏:)的影响

G++ 的选项-E意味着"预处理源文件,但不编译,不汇编,也不链接"。