C预处理器和C库-学习笔记

来源:互联网 发布:程序员笔试题 编辑:程序博客网 时间:2024/05/16 09:04

C预处理器和C库 学习笔记


1.常量: #define
只进行替换不进行计算

#define SQRT(X) X*XSQRT(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##nXNMAE(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