1.预处理
可以使用预处理和具有预处理的功能是C语言和其他高级语言的区别之一。
宏定义
宏定义是预处理命令的一种,它提供了一种可以替换源代码中字符串的机制。
宏定义的类型
可以简单分为有参数宏定义,和无参数宏定义。
(1)不带参数宏定义
语法:#define 宏名 字符串
demo:1 # define Y "ZYY"
详解:
- # 表示这是一条预处理命令
- 宏名是一个标识符,必须符合C语言标识符的规定
- 字符串 这里可以是常数,表达式,格式字符串等。
注意:宏定义不是C语言,不需要在末尾加分号.
宏名定义以后也可以成为其他宏名定义的一部分
demo: # define PI 3.1415
# define PI2 PI*PU
注意:如果字符串中含有宏名的话则不会被替换
#undef 可以用来终止宏定义的作用范围
语法: #undef 宏名
(2)带参数的宏定义
带参数的宏定义不是简单的字符串替换,还要进行参数替换 一般形式如下:
#define 宏名(参数) 字符串
demo:
1 # include <stdio.h> 2 # include <stdlib.h> 3 # define MIX(a,b) ((a)*(b)+(b)) 4 int main () 5 { 6 int x = 5,y = 9; 7 printf("x,y: "); 8 printf("%d,%d ",x,y); 9 printf("the main number is %d ",MIX(x,y)); 10 return 0; 11 }
用宏定义来代替函数的好处是可以增加代码的执行速度,因为不存在函数的调用,缺点是由于重复编码,增加了程序的长度
注意:
宏定义时参数要加括号,如不加括号,则有时结果是正确的,有时结果却是错误的
宏扩展必须使用括号来保护表达式中低优先级的操作符号,以确保调用时达到想要的效果
在带参数宏定义中,形式参数不分配内存单元,不必作类型定义
在宏定义中,宏名与带参数的括号之间不可以加空格,否则会将空格以后的字符都作为替代字符串的一部分
2.#include指令
在一个源文件中可以使用#include指令将另一个源文件的全部内容包含进来
demo:
1 # include <stdio.h> 2 # include "stdio.h"
上面给出了<> 尖括号 ""和双引号两种形式,它们是有一定的区别的
1)尖括号
系统到存放C库函数头文件所在的目录中寻找要包含的文件,这是标准的方式
2)双引号
系统先到当前代码文件所在的目录下寻找要包含的文件,如果找不到,再到存放C库函数头文件所在的目录中寻找
demo:
f1.h
1 # define P printf 2 # define S scanf 3 # define D "%d" 4 # define C "%c" 5
f2.cpp
1 # include <stdio.h> 2 # include <stdlib.h> 3 # include "f1.h" 4 int main () 5 { 6 int a; 7 P("please input: "); //printf 8 S(D,&a);//scanf 9 P("The number is : "); //printf 10 P(D,a);// printf 11 P(" "); //printf 12 return 0; 13 }
f1.h存放宏替换指令
f2.cpp 使用这些宏指令