一 宏
预处理器是一个文本替换工具
宏就是文本替换
//宏一般使用大写区分
//宏变量
//在代码中使用 A 就会被替换为1
#define A 1
//宏函数
#defind test(i) i > 10 ? 1: 0
//其他技巧
// # 连接符 连接两个符号组成新符号
#define DN_INT(arg) int dn_ ## arg
DN_INT(i) = 10;
dn_i = 100;
// \ 换行符
#define PRINT_I(arg) if(arg) { \
printf("%d\n",arg); \
}
PRINT_I(dn_i);
//可变宏
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,"NDK", __VA_ARGS__);
//陷阱
#define MULTI(x,y) x*y
//获得 4
printf("%d\n", MULTI(2, 2));
//获得 1+1*2 = 3
printf("%d\n", MULTI(1+1, 2));
二 宏函数
优点:
文本替换,每个使用到的地方都会替换为宏定义。
不会造成函数调用的开销(开辟栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆
栈。)
缺点:
生成的目标文件大,不会执行代码检查
三 内联函数
和宏函数工作模式相似,但是两个不同的概念,首先是函数,那么就会有类型检查同时也可以debug
在编译时候将内联函数插入。不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。
如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。
拓展:手写sprintf
根据可变参数、指针运算等知识自己实现 sprintf 函数(只实现 %d 就行)!