预处理器、宏、内联函数
1、预处理器
预处理器不是编译器,但是它是编译过程中一个单独的步骤。
预处理器是一个文本替换工具
所有的预处理器命令都是以井号(#)开头
常用预处理器
预处理器 | 说明 | |
---|---|---|
#include | 导入头文件 | |
#if | if | 开启关闭某些代码块 |
#elif | else if | |
#else | else | |
#endif | 结束 if | |
#define | 宏定义 | |
#ifdef | 如果定义了宏 | |
#ifndef | 如果未定义宏 | |
#undef | 取消宏定义 | |
#pragma | 只会导入一次文件 |
2、宏 ~ 执行文本替换的
宏变量,就是执行文本替换的。有点类似于 java 中的 ConstantUtils 中的final static String url
宏函数, 定义了一个函数的别名。我测试的时候,宏函数中不能 有 回车。 如果有需要加 \ 符号
宏 函数的优缺点
执行文本替换,是把code放到对应的位置,不会造成函数调用的开销(开辟栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。)
(缺点:)生成的目标文件大,不会执行代码检查。 因为是 复制的 关系,所以实际编译的时候,大量的宏函数会导致代码的实际量会变大
#define nuM 110;
#define TEST(a) {\
int rucan = a + 10;\
printf("current value %d\n", rucan);\
}
#define CHENG(x, y) x * y;
int main() {
int a = nuM;
printf("%d\n", a);
TEST(a);
// 文本替换 2 + 2 * 3 + 2
int ji = CHENG(2+2, 3 + 2);
printf("%d\n", ji); // 所以 ji 是 10 不是20
return 0;
}
3、内联函数
与 宏 函数 相似。 工作模式也是 代码替换
内部的逻辑不能太复杂,复杂就会失效(使用 while 、swich、 for 等 复杂的语句) 。并且内联函数本身不能直接调用自身
定义内联函数 ~ 还不太会用
inline int yangxinyu(int a) {
printf("current = %d\n", a);
}