回顾下 之前的博客中 介绍的 内联函数 :
调用 int c = fun1(++a, b); 代码 , fun1 是 普通函数 ;
执行时 ,
首先 , 执行 a 的自增 , 之后变量 a = 2 ;
然后 , 执行 fun1 普通函数 , 传入两个参数 , 将 a = 2 , b = 3 当做实参 传入 普通函数 ;
最后 , 普通函数 返回 a = 2 , b = 3 中 较小的值 , 赋值给 c = a = 2 ;
因此 , 最终得到的结果是 : a = 2 , b = 3 , c = 2;
代码示例 - 内联函数执行分析 :
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include
// 导入 std 命名空间
using namespace std;
// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
// 一旦像这样声明 内联函数
// 编译器 编译时 会拒绝该内联函数的 内联请求
// 将其作为普通函数处理
//inline int fun(int a, int b);
// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))
// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
return a < b ? a : b;
}
// 普通函数 : 获取 a 和 b 中较小的值
inline int fun1(int a, int b)
{
return a < b ? a : b;
}
int main() {
int a = 1;
int b = 3;
// 调用普通函数
// 此时先执行 a 的自增 a = 2
// 然后再执行函数 , 将 a = 2 , b = 3 传入
// 结果得到 a b 中较小的值 c = a = 2
int c = fun1(++a, b);
// 打印内联函数调用结果
printf("a = %d, b = %d, c = %d\n", a, b, c);
// 控制台暂停
system("pause");
return 0;
}
执行结果 :
a = 2, b = 3, c = 2
请按任意键继续. . .
调用 int c = fun(++a, b); 代码 , fun 是 内联函数 ;
执行时 ,
首先 , 执行 a 的自增 , 之后变量 a = 2 ;
然后 , 执行 fun 内联函数 , 传入两个参数 , 将 a = 2 , b = 3 当做实参 传入 内联函数 ;
最后 , 内联函数 返回 a = 2 , b = 3 中 较小的值 , 赋值给 c = a = 2 ;
因此 , 最终得到的结果是 : a = 2 , b = 3 , c = 2;
内联函数 的 执行结果 , 与 普通函数 的执行结果是一样的 ;
代码示例 - 内联函数执行分析 :
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include
// 导入 std 命名空间
using namespace std;
// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
// 一旦像这样声明 内联函数
// 编译器 编译时 会拒绝该内联函数的 内联请求
// 将其作为普通函数处理
//inline int fun(int a, int b);
// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))
// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
return a < b ? a : b;
}
// 普通函数 : 获取 a 和 b 中较小的值
inline int fun1(int a, int b)
{
return a < b ? a : b;
}
int main() {
int a = 1;
int b = 3;
// 调用内联函数
// 此时先执行 a 的自增 a = 2
// 然后再执行函数 , 将 a = 2 , b = 3 传入
// 结果得到 a b 中较小的值 c = a = 2
int c = fun(++a, b);
// 打印内联函数调用结果
printf("a = %d, b = %d, c = %d\n", a, b, c);
// 控制台暂停
system("pause");
return 0;
}
执行结果 :
a = 2, b = 3, c = 2
请按任意键继续. . .
执行 int c = FUN(++a, b); 代码 , 调用宏代码片段 ;
宏代码片段在 预编译阶段 机械的将宏展开 , 宏替换很机械 ;
宏替换结果如下 : 将 ++a 替换到 FUN(a , b) 中 a 的位置 ,
((++a) < (b) ? (++a) : (b))
执行过程如下 :
代码示例 - 宏代码片段执行分析 :
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include
// 导入 std 命名空间
using namespace std;
// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
// 一旦像这样声明 内联函数
// 编译器 编译时 会拒绝该内联函数的 内联请求
// 将其作为普通函数处理
//inline int fun(int a, int b);
// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))
// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
return a < b ? a : b;
}
// 普通函数 : 获取 a 和 b 中较小的值
inline int fun1(int a, int b)
{
return a < b ? a : b;
}
int main() {
int a = 1;
int b = 3;
// 调用宏代码片段
// 机械的将宏展开 , 宏替换很机械
// 宏替换结果如下 : 将 ++a 替换到 FUN(a , b) 中 a 的位置
// ((++a) < (b) ? (++a) : (b))
// 首先 , 执行 ++a 变为 2 ,
// 然后 , 比较 2 < 3 , 返回结果是 (++a) 此时又要自增一次 a 变为 3
// 最后 , a = 3 返回 , 最小值为 3
int c = FUN(++a, b);
// 打印内联函数调用结果
printf("a = %d, b = %d, c = %d\n", a, b, c);
// 控制台暂停
system("pause");
return 0;
}
执行结果 :
a = 3, b = 3, c = 3
请按任意键继续. . .