C语言对源程序处理的四个步骤:预处理、编译、汇编、链接。
预处理是在程序源代码被编译之前,由预处理器(Preprocessor)对程序源代码进行的处理。这个过程并不对程序的源代码语法进行解析,但它会把源代码分割或处理成为特定的符号为下一步的编译做准备工作。
“文件包含处理”是指一个源文件可以将另外一个文件的全部内容包含进来。C语言提供了#include命令用来实现“文件包含”的操作。
注意:
1. #include <>常用于包含库函数的头文件;
2. #include ""常用于包含自定义的头文件;
3. 理论上#include可以包含任意格式的文件(.c .h等) ,但一般用于头文件的包含;
如果在程序中大量使用到了100这个值,那么为了方便管理,我们可以将其定义为:
const int num = 100; 但是如果我们使用num定义一个数组,在不支持c99标准的编译器上是不支持的,因为num不是一个编译器常量,如果想得到了一个编译器常量,那么可以使用:
#define num 100
在编译预处理时,将程序中在该语句以后出现的所有的num都用100代替。这种方法使用户能以一个简单的名字代替一个长的字符串,在预编译时将宏名替换成字符串的过程称为“宏展开”。宏定义,只在宏定义的文件中起作用。
- #define PI 3.1415
- void test()
- {
- double r = 10.0;
- double s = PI * r * r;
- printf("s = %lf\n", s);
- }
输出结果
s = 314.150000
说明:
在项目中,经常把一些短小而又频繁使用的函数写成宏函数,这是由于宏函数没有普通函数参数压栈、跳转、返回等的开销,可以调高程序的效率。
宏通过使用参数,可以创建外形和作用都与函数类似地类函数宏. 宏的参数也用圆括号括起来。
- #define SUM(x,y) (( x )+( y ))
- void test()
- {
- //仅仅只是做文本替换 下例替换为 int ret = ((10)+(20));
- int ret = SUM(10, 20);
- printf("ret:%d\n",ret);
- }
输出结果
ret:30
注意:
一般情况下,源程序中所有的行都参加编译。但有时希望对部分源程序行只在满足一定条件时才编译,即对这部分源程序行指定编译条件。
防止头文件被重复包含引用;
- #ifndef _SOMEFILE_H
- #define _SOMEFILE_H
-
- //需要声明的变量、函数
- //宏定义
- //结构体
-
- #endif
C编译器,提供了几个特殊形式的预定义宏,在实际编程中可以直接使用,很方便。
- // __FILE__ 宏所在文件的源文件名
- // __LINE__ 宏所在行的行号
- // __DATE__ 代码编译的日期
- // __TIME__ 代码编译的时间
-
- void test()
- {
- printf("%s\n", __FILE__);
- printf("%d\n", __LINE__);
- printf("%s\n", __DATE__);
- printf("%s\n", __TIME__);
- }
输出结果
- E:\TortoiseGit-2.8.0.0-64bit\cs_-c\C_2022_07_26\C_2022_07_26\test.c
- 40
- Jul 26 2022
- 11:03:04