- 可变参数: stdarg.h
#include<cstdio>
#include<cstdarg>
//lim传入的值为传入参数的个数
double sum(int lim, ...){
va_list ap; //va_list 代表一种数据对象
double tot = 0;
va_start(ap, lim); //初始化 ap 为参数列表
for(int i = 0; i < lim; i++){
tot += va_arg(ap, double); //获取参数, 后一个double表示获取参数的类型
}
va_end(ap); //清理工作
return tot;
}
int main(){
double t = sum(5, 1.0, 9.1, 9.6, 4.45, 6.47);
printf("%g\n", t);
return 0;
}
- 诊断库: assert.h
#include<assert>
assert(条件判断); //当条件为true继续执行,当条件为false终止运行,输出错误信息
//若想禁用assert()宏的机制,可在#include<assert> 之前加上#define NDEBUG
- 通用工具库: stdlib.h
exit(); //退出程序
atexit(* function); //传入参数为函数指针,注册该函数,在程序退出时执行该函数,可进行多次调用,符合先进后出
- 内联函数
// 声明内联函数表示的是建议编译器尽可能快速的调用该函数
//实现效果可能是函数调用的地方用函数体进行替换
inline void eat(){
while(getchar() != '\n')
continue;
}
int main(){
eat();
}
可变宏: … 和
__VA_ARGS__
#define PR(...) printf(__VA_ARGS__) //__VA_ARGS__ 用在替换部分,以表明省略号代表的内容 PR("Howdy"); PR("weight = %d, shipping = %d", wt, sp);
- 预处理器的粘合剂: ##运算符
#define XNAME(N) x##N
XNAME(4) // 得到的结果为x4
int XNAME(1) = 14; //等效为 int x1 = 14;
- # 运算符
#define PSQR(x) printf("The square of "#x" is %d\n", ((x) * (x)))
PSQR(6); //输出为 The square of 6 is 36
- \ 使用
printf("That's wond\
erful!\n"); //编译器查找反斜线后紧跟换行符的实例并删除这些实例,将以上两个物理行转换成一个逻辑行