1. C 模块化
1.1. 头文件 .h
#include 可以引用用户和系统头文件。
1.1.1. 用户头文件
-
为了防止 一个头文件被引用两次,编译器会处理两次头文件的内容 的错误. 标准的做法是把文件的整个内容放在条件编译语句中,如下: 文件名 Xxx.h 开头大写 #ifndef HEADER_FILE
#define HEADER_FILE
the entire header file file( 定义宏, 定义结构体, extern 变量, 声明函数 )
#endif
-
HEADER_FILE 格式:
- 以 _ 开头(结尾);
- 将 . 换成 _ ;
- 字符全部大写.
1.1.2. extern 关键字
extern 这个关键字的真正的作用是引用不在同一个文件中的变量或者函数。
1. .h文件定义extern变量文件: extern unsigned int **全局**变量名
2. .c文件使用extern变量的文件: unsigned int **全局**变量名
1.2. c文件
1. include "xxx.h" // .c文件中,开头小写(.h文件 开头大写)
2. 将.h文件中的 `extern` 关键字修饰的变量 在.c文件中去掉 `extern` 再声明一次
3. 将.h文件中的函数声明写出函数体.
2. 预处理指令(以 # 开头)
2.1. 宏定义
#define 标识符(宏) 常量
程序中用标识符来表示这个常量. 一直到源程序结束, 提前终止:
#undef 标识符
2.2. 条件编译
- #if、#elif、#else 和 #endif 都是预处理命令,
- 在预处理阶段执行, 根据情况保留代码, 不仅保证了代码正确, 还减小了编译后文件的体积. 这种机制被称为条件编译。
### 2.2.1. DEBUG实例
```c
/* 条件编译: 只保留符合条件的代码 */
#include <stdio.h>
#define DEBUG 1 // 0 NO; 1 YES
int main()
{
#if DEBUG
printf("DEBUG...\n");
#endif
return 0;
}
```
2.3. #ifdef、#ifndef、#endif
#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef 与#ifdef相反,判断某个宏是否未被定义
实例链接
2.4. defined() 运算符
预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。 已定义,则值为真(非零)。 未定义,则值为假(零)。
#include <stdio.h>
#define DEBUG "定义DEBUG"
#if defined(DEBUG)
#undef DEBUG
#define DEBUG printf("您已定义DEBUG\n")
#else
#define DEBUG printf("已为您定义DEBUG\n")
#endif
int main()
{
DEBUG;
return 0;
}
|