混合内联和宏函数
Mixing inline and macro functions
我决定尝试一些东西。我知道宏是邪恶的,应该避免,但想看看如果我做这样的事情会发生什么。
#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
。
宏替换在编译之前通过预处理器执行。因此,编译器永远不会看到add(3,5)
- 它只看到宏扩展。
没有"宏函数"这样的东西。编译器(实际上是预处理器(只是将main
变成
int main()
{
( cout << "Macro: " << 3 + 5 << endl );
}
宏在定义它的位置生效,因此内联函数不会被宏替换,但您的调用会在编译之前被替换。另请注意,宏不是一个函数,它告诉预处理器替换文本的模式。
您可以运行以下命令并查看输出文件 (your.i
(
g++ -o your.i -E your.cpp
^
您会发现内联功能不受宏:)的影响
G++ 的选项-E
意味着"预处理源文件,但不编译,不汇编,也不链接"。
相关文章:
- 使用英特尔内部函数 (AVX) 中的混合说明
- 将 lambda 函数转换为具有混合 lambda 引入器和参数列表的函子结构
- 好奇的混合与可变参数构造函数
- 参数的混合值,当我调用指针成员函数时
- 混合内联和宏函数
- 混合 C 和 C++.. 对函数的未定义引用
- 混合 c++ 和汇编不能将多个参数从C++函数传递到程序集
- 混合类和函数模板
- 混合模板类型的模板参数包(std::使用可选参数重新创建函数)
- 函数模板与重载混合
- 重载+运算符问题与其他类中的友元函数混合
- 混合函数-增加浮点出现次数
- 什么是可以与C++混合的好的函数式语言
- 将从基类继承的构造函数与自定义构造函数混合使用
- 在构造函数中混合可变参数模板和初始值设定项列表
- 是否可以混合使用虚拟函数和函数对象以使用标准算法
- 在Matlab中使用OS X编译/混合imrender函数时出错
- 将构造函数与固定参数混合,将构造函数与构造函数模板混合在一起
- 将C++实例方法与C回调函数混合使用
- 与C函数混合时出现C++unique_ptr错误