C Primer Plus阅读--章节16
C Primer Plus阅读–章节16
翻译程序的第一步
预处理之前,编译器必须对该程序进行一些翻译处理。
- 首先,编译器将源代码中出现的字符映射到源字符集。
- 第二,编译器定位每个反斜杠后面跟着换行符的实力,并删除他们。物理行的合并。
- 编译器将文本呢划分成预处理记号序列、空白序列和注释序列。
预处理指令从#开始运行,到后面的第一个换行符为止。指令的长度仅限于一行(预处理开始之前,编译器会把多个物理行处理为一个逻辑行)。
使用替换提替代宏。
#define LIMIT 20
const int LIM = 50;
static int data1[LIMIT]; //有效
static int data2[LIM]; //无效
const int LIM2 = 2 * LIMIT; //有效
const int LIM3 = 2 * LIM; //无效
//数组大小必须是整型常量、枚举常量和sizeof表达式,不包括const声明的值
//const是ANSI的限定为,用其修饰的变量为只读,但也需要分配内存,因此不符合常量的要求。
- 使用宏参数创建字符串:#运算符
- 将宏参数的形参名以字符串的形式进行替换
#define PSQR(X) printf("The square of " #X " is %d.\n", ((X)*(X)))PSQR(y);
PSQR(2 + 4)//输出:
//The square of y is 25.
//"The square of 2 + 4 is 36.
- 预处理器粘合剂:##运算符
#define XNAME(n) x ## n
- 变参宏:…和__VA_ARGS__
#define PR(...) printf(__VA_ARGS__)#define PR(x, ...) printf("Message " #x ": " __VA_ARGS__)
-
#line和#error
- #line指令重置__LINE__和__FILE__宏报告的行号和文件名。
- #error指令让预处理器发出一条错误指令,在编译过程中中断
-
#pragma:将编译指令放入源代码。
#pragma c9x on
- 泛型选择
#define MYTYPE(X) _Generic(X, \int: "int", \float: "float", \double: "double", \default: "other"\
)
- inline函数(C99)
inline static void eatline(){while(getchar()!= '\n')continue;
}int main(){eatline();
}
- _Noreturn(C11)