C预处理器和C库 学习笔记
只进行替换不进行计算
#define SQRT(X) X*X
SQRT(a+2);
直接替换为: a+2*a+2,和预期不同,可以通过加括号来达到预期结果
#define SQER(X) (X)*(X)
2. 利用宏参数创建字符串: #运算符
在类函数宏的替换部分中,#符号用做一个预处理运算符,可以把语言符号转换为字符串,例如,如果x是一个宏参量,那么 #x 可以把参数名转换为对应的字符串,该过程称为字符串化(stringizing)
#define PSQR(x) printf("The square of " #x " is %d.\n",((x)*(x)))
PSQR(2+4)
输出 The square of 2+4 is 36.
3.预处理器的粘合剂: ## 运算符
#define XNMAE(n) x##n
XNMAE(4); // 替换为 x4.
在MFC框架中常使用“##”来粘合
4.可变宏: ...和__VA_ARGS__
#define PR(...) printf(__VA_ARGS__)
PR("Howdy");
PR("weight = %d, shipping = $%.2f\n", wt, sp);
第一次调用__VA_ARGS__展开为一个参数
“Howdy”
相当于
printf("Howdy");
第二次调用__VA_ARGS__展开为三个参数
"weight = %d, shipping = $%.2f\n", wt, sp
相当于
printf("weight = %d, shipping = $%.2f\n", wt, sp);
5.文件包含: #include
6.#undef 取消一个给定的#define
7.条件编译
#ifdef #else #endif
#ifndef
#if #elif
8.一些预定义宏
__DATE__ __FILE__ __LINE__ __STDC__ __STDC_HOSTED__ __TIME__ __STDC_VERSION__
#line 用于重置由__LINE__, __FILE__宏报告的行号和文件名
#line 1000
#line 10 "cool.c"
9.#error使预处理器发出一条错误信息
10.#progma