我决定尝试一下。我知道宏是邪恶的,应该避免,但想看看如果我做这样的话会发生什么。
#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.2
,g++ 5.4.0
,没有参数g++ -g t2.cpp -o t2
。
答案 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 );
}