一、多文件编程
1.1 多文件编程介绍
(1) 在实际的大型项目开发中,项目的代码是分文件和目录进行管理的:不同文件中编写不同功能的代码。
.c ---> 源文件:主要存放函数的定义,变量的定义,头文件的包含。
.h ---> 头文件:主要存放函数的声明,变量的声明,宏定义。
(2) 如果某个.c 文件中需要使用函数或者宏定义时,只需要在 .c 文件中使用#include 包含头文件即可。
(3) 头文件在预处理阶段进行展开
1.2 防止头文件重复包含的机制:
头文件包含多次,只在第一次包含时展开,后边在包含时不进行展开。
# ifndef __头文件名变成大写_H__
# define __头文件名变成大写_H__
函数的声明 / 变量的声明 / 宏定义
#endif
说明:
第一次包含头文件时,判断 “__头文件名变成大写_H__” 宏定义是否被定义。此时没有进行宏定义,所以下边的代码会被展开。执行 “#define __头文件名变成大写_H__” 进行宏定义。
第二次或者第三次等等再次包含此头文件时,判断 “__头文件名变成大写_H__” 宏定义是否被定义。很明显第一次包含此头文件之后进行了“__头文件名变成大写_H__” 的宏定义,因此后边在重复包含此头文件时,头文件中的声明将不会被展开。
二、多文件编程例题 --> 冒泡排序
将冒泡排序的函数放到一个单独的.c文件中,在 main.c 中调用此函数。
2.1 代码实现:
(1)sort.h 文件:
#ifndef __SORT_H__
#define __SORT_H__
#include<stdio.h>
void print_sort(int *arr);
void array_sort(int *arr, int len);
#endif
(2)sort.c 文件:
常规的写法:
#include "sort.h"
//遍历数组
void print_sort(int *arr){
for(int i = 0; i < 10; i++){
printf("%d ",arr[i]);
}
printf("\n");
}
//排序 升序
void array_sort(int *arr, int len){
int i = 0;
int j = 0;
int temp = 0;
//外层循环控制比较的趟数
//当只剩下最后一个元素时,就不用再比了,所以可以少比一趟
for(i = 0; i < len-1; i++){
//内层循环用来找每趟的最大值
//因为每趟都能确定一个最大值,所有每趟可以少比一个元素,所以 -j
for(j = 0; j < len-i-1; j++){
//若要降序排序,只需把此处的 > 改成 < 即可
if(arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
优化的写法:
有时候,数据不一定需要必到最后才能确定有序,可能比到中途就已经有序了,如下数据: 1 2 3 4 5 6 7 8 10 9
此时对已经有序的数据进行比较,就是多余的操作
优化方式:使用标志位确定数据是否已经有序,代码优化如下:
#include "sort.h"
//遍历数组
void print_sort(int *arr){
for(int i = 0; i < 10; i++){
printf("%d ",arr[i]);
}
printf("\n");
}
//排序 升序
void array_sort(int *arr, int len){
//用于判断是否有序的标志位 0 有序 1 无序
int flag = 0;
int i = 0;
int j = 0;
int temp = 0;
//外层循环控制比较的趟数
//当只剩下最后一个元素时,就不用再比了,所以可以少比一趟
for(i = 0; i < len-1; i++){
//每趟开始时,都认为是已经有序了
flag = 0;
//内层循环用来找每趟的最大值
//因为每趟都能确定一个最大值,所有每趟可以少比一个元素,所以 -j
for(j = 0; j < len-i-1; j++){
//若要降序排序,只需把此处的 > 改成 < 即可
if(arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 1; //如果发生交换,说明数据不是有序的,继续执行排序
}
}
//如果没有发生交换,flag仍然为0,说明数据已经有序,跳出循环
if(flag == 0){
break;
}
}
}
(3)main.c 文件:
#include "sort.h"
int main(int argc, const char *argv[])
{
int arr[10] = {8,5,7,3,1,6,2,9,10,4};
int len = sizeof(arr)/sizeof(arr[0]);
//排序前
print_sort(arr);
//进行排序
array_sort(arr,len);
//排序后
print_sort(arr);
return 0;
}
2.2 代码的编译:
法1:gcc main.c sort.c -o sort
法2:gcc *.c -o sort