其实在C语言的远行过程中,有这样一个流程,
编译:C----〉可执行文件(可以运行的)
1:.C------.i 预处理(之前和之后还是C语法)
2: .i-------.s 编译(之前是C语法,之后是汇编语法)
3: .s------.o 汇编
4: .o------可执行程序 链接
下面我们就来说说一说第一个步骤预处理阶段:
一:预处理介绍
- 预处理:单纯的宏的替换
- 宏:发生在预处理阶段的单纯的字符串的替换
- C语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等
二:预处理中宏的定义无参宏定义
#define M (x+y+3+xy)带参宏定义
#define M(x,y) (x+xy+3+xy)三:宏的使用main(){
int Num = M; int Num2 = M(2,5); printf("%d, %d", Num, Num2);
}这里我们就使用了上面定义的两个宏,也就是实现了预处理命令的使用
指针变量:NULL---》(void *)0可赋值任何类型的指针
整形:0
四:常用预处理命令
e>预定义的宏(不能用undef取消)
C标准中指定了一些预定义的宏,对于编程经常会用到。下面这个表中就是一些常常用到的预定义宏。
__DATE__
进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)
__FILE__
代表当前源代码文件名的字符串文字
__LINE__
代表当前源代码中的行号的整数常量
__TIME__
源文件编译时间,格式微“hh:mm:ss”
__func__
当前所在函数名
对于__FILE__,__LINE__,__func__这样的宏,在调试程序时是很有用的,因为你可以很容易的知道程序运行到了哪个文件的那一行,是哪个函数。
下面一个例子是打印上面这些预定义的宏的。
五:预处理总结
- 1. 预处理功能是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。程序员在程序中用预处理命令来调用这些功能。
- 2. 宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏调用中将用该字符串代换宏名。
- 3. 宏定义可以带有参数,宏调用时是以实参代换形参。而不是“值传送”。
- 4. 为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符串中出现的形式参数两边也应加括号。
- 5. 文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。
- 6. 条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率。
- 7. 使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。
这里说一下关于typedef和宏的区别
1:宏后面是不需要加;的
而typedef后面需要加;
2:typedef的作用域时每个{}之内
宏的作用域从申明到文件结束