C语言的组成:
一个C源程序是由多个.c文件和.h文件组成。
源程序:是指未编译的按照一定的程序设计语言规范书写的文本文件。 .c文件:C源代码文件(源代码指的是一系列人类可读的计算机语言指令)。 .h文件:头文件?
-
.c文件的组成
(1) 预处理指令
以“#”开头的就是预处理指令
预处理指令在程序编译之前就会事先做的处理。a. 文件包含命令 #include 包含命令 作用:就是把#include后面的那个文件中的内容在此处展开(复制粘贴)。 #include
#include "02.h" 上面两者都是文件包含命令,都是在特定的文件夹下(路径下)搜索相应的头文件, 然后把该文件的内容在使用包含命令处展开,但不同的是,其搜索路径不一样。 <>表示在系统标准的头文件路径(如:/usr/include...)下搜索,可以理解为官方路径。 ""表示先在工程的当前路径下搜索,如果没有找到的话,再去官方路径下搜索。 b. 宏定义 宏定义:定义一个宏 宏:是一种批量处理的称谓。他就是一个用来替换别人的东西。 宏定义的形式如下: #define 宏名 替换文本 后续所有出现宏名的地方都将被替换为替换文本。 宏有两种: 1. 不带参数的宏 例子: #define PI 3.14 double area = PI * r * r; ===> area = 3.14 * r * r; 2. 带参数的宏 语法: #define 宏名(参数) 替换文本 例子: #define max(a,b) a > b ? a : b max(a,b)作用是求出a和b之间的最大值 max(2,3) --> 2 > 3 ? 2 : 3 --> 3 int a = max(3,2) + 5; a = ? typedef是一个关键字,作用是为一种数据类型定义一个新的名字
可以是基本类型,也可以是自定义类型。语法:
typedef 现有的类型名(旧类型名) 新的类型名;
—>新的类型名就和现有的类型名意义是一样的了使用typedef目的一般有两个:
1. 给旧类型一个易记且意义明确的名字
例子:
typedef unsigned char uint8;
typedef unsigned int uint32;
2. 简化一些比较复杂的类型声明
例子:
typedef struct student STU;
struct student s;
<===> STU s;
struct student
{
int num;
char name[32];
}stu1,stu2,stu3;
struct student stu;
struct
{
int num;
char name[32];
}stu1,stu2,stu3;
struct stu;//error
typedef struct student
{
int num;
char name[32];
}STU;
int NUM[100];//定义了一个数组,数组名为NUM 想定义一个和NUM一样类型的变量a: typeof(NUM) a; int[100] a; ---> int a[100]; typedef int[100] NUM_T; --->typedef int NUM_T[100];//NUM_T是一个新的类型名,相当于int[100] NUM_T a; <===> int a[100]; void (*p)(int,int)//定义了一个函数指针,指针名为p typeof(p) p1; void (int,int)* p1; ---> void (*p1)(int,int) typedef void (int,int)* func_t --> typedef void (*func_t)(int,int)//func_t是一个新的类型
总结:
int a;//a就是一个变量 typedef int a;//a就是一个类型,这个类型就是int,a就是int的别名 int b[100];//b就是一个数组 typedef int b[100];//b就是一个新的类型名,等用于int[100] int (*p)(void);//p就是一个函数指针变量名 typedef int (*p)(void);//p就是一个新的类型名,等同于int (void) * p p1;
typedef 与 define的比较:
typedef define 语法不同 末尾需要; 末尾不需要; 一条语句 是一条预编译指令 处理阶段不同 typedef在编译时处理 在预处理阶段处理 作用不同 给现有的类型起别名 替换作用 作用域不同 typedef只能在定义的作用域 任何地方都可以使用 内使用 对指针的操作 typedef int* pint; #define pint int* 不同 pint a,b; pint a,b; a和b都是int* a是int*,b是一个int
c. 条件编译
条件编译一般我们放在.h文件中。
#ifndef xxxx//如果没有定义xxxx,那么就定义xxxx,那么在#endif之前的语句才会参与编译
#define xxxx//防止重复定义
…
#endif
(2) 声明
外部对象的声明
(3) 全局变量和函数的定义
2 .
.h文件接口描述文件
包含一些声明:
函数的声明、外部变量的声明、类型的声明…
头文件中一般不包含具体代码的实现,只是一个接口文件而已。



