九、本来打算写枚举的,算了,直接看菜鸟教程吧。。。
十、C语言的预处理:
所谓的预处理就是进行编译的第一遍扫描(语法分析)之前所做的工作;
C的预处理功能有:
宏定义:#define
文件包含:#include "stdio.h"或#include <stdio.h>
条件编译:#if、#endif、#ifndef、#else、#endif
#:预处理命令标记
define 、if、endif等为宏命令
1.宏定义:#define
宏定义只是简单的替换、不占用内存,在预处理的时候就被处理掉了,不是声明也不是语句,不用加分号。
#define LISTEN NB//这个定义告诉编译器所有的Listen将替换为NB
带参数的宏定义,模拟函数:
#define MAX(x,y) (((a)>(b))?(a):(b))
注意:宏的定义可以是大写也可以小写,一般情况用大写,便于阅读和理解。
2.文件包含:#include "stdio.h"或#include <stdio.h>
<>:表示在系统头文件目录中查找;
“”:表示先在当前目录中查找,等找不到了再去系统头文件目录中查找;
3.条件编译:#if、#endif、#ifndef、#else、#endif
有时候一个工程不止有.c文件,还有头文件,此时我们要定义头文件(ds1302):
#ifndef __DS1302_H//意思是如果没有定义ds1302这个文件
#define __DS1302_H//那就定义ds1302这个文件
.....//打代码。。。
#endif//呼应前面的#ifndef
#ifdef
。代码一。。。
#else
。代码二。。。
#endif
这个跟if elsed 语句一样,如果标识符已经被#define定义过,则编译代码一的内容;
如果没有就编译代码二
#ifndef
。代码一。。。
#else
。代码二。。。
#endif
这个上面的意思相反,如果标识符没有被#define定义过,则编译代码一的内容;
否则就编译代码二
4.宏延续运算符(\)
一个宏通常写在一个单行上。但是如果宏太长,一个单行容纳不下,则使用宏延续运算符(\)。例如:
如:
#include <stdio.h>
#define message_for(a, b) \
printf(#a " and " #b ": I love listen!\n")
int main(void)
{
message_for(BB, MM);
return 0;
}
这里用到了#:
在宏定义中,当需要把一个宏的参数转换为字符串常量时,则使用字符串常量化运算符(#)。
标记粘贴运算符(##):宏定义内的标记粘贴运算符(##)会合并两个参数
#include <stdio.h>
#define listenpaster(n) printf ("listen" #n " = %d", listen##n)
int main(void)
{
int listen_01 = 100;
listenpaster(_01);//输入了_01->n
return 0;
}
5.C语言的一些常用宏:
DATE 当前日期,一个以 “MMM DD YYYY” 格式表示的字符常量。
TIME 当前时间,一个以 “HH:MM:SS” 格式表示的字符常量。
FILE 这会包含当前文件名,一个字符串常量。
LINE 这会包含当前行号,一个十进制常量。
STDC 当编译器以 ANSI 标准编译时,则定义为 1。
#include <stdio.h>
int main()
{
printf("File :%s\n", __FILE__ );
printf("Date :%s\n", __DATE__ );
printf("Time :%s\n", __TIME__ );
printf("Line :%d\n", __LINE__ );
printf("ANSI :%d\n", __STDC__ );
return 0;
}
//本次素材部分来自菜鸟教程和网络。。。