在写一个 .c 文件的时候,如果代码的数量很大就会使后续的调试和添加功能增加难度。
如果没有很清晰的思路,在很大的篇幅的代码中进行操作是一件很让人头疼的事情。
所以我们可以将代码分成很多个 C 文件 这样让代码的结构更清晰。
同时在一个写好的函数以后可以直接拿来使用,这样减少了代码的重复书写,减少重复无意义的工作。
这样你就可以在你的这个函数本身上,进行不断的修改调试让这个功能实现的更完善。
为了实现这个就用到了接口,在这里用头文件实现参数和函数的接口。
下面举一个例子:
1 #ifndef _Add_ 2 #define _Add_ 3 struct Student 4 { 5 int number; 6 char name[10]; 7 struct Student *next; 8 }; 9 extern void _Add_print(struct Student *head); 10 extern struct Student * _Add_add(struct Student *head); 11 #endif
所以这个头文件的基本书写基本的方式是:
1 #ifndef _Add_ //这个名可以根据自己的要求进行更改,C语言头文件中的宏定义都要加前后下划线所以我这里也这样做了 2 #define _Add_ //这段的意思是如果没有宏定义 _Add_ 就定义 _Add_ 3 /*这里写上你希望使用的变量和函数但是只是暴露形式(函数类型和它的参数)并不对函数进行实现因为这不是接口应该实现的工作*/ 4 #endif //结束宏定义
那么其实一个头文件的定义,如果你只有少量的代码的时候,不添加如上的一段代码,也是可以正常编译使用的并且不会出现任何问题,但是如果出现了代码文件很多的情况,就可能出像头文件重复调用的情况,我想你当然不会写出如下的代码。
#include<stdio.h> #include"Status.h" #include"Status.h"
但是你不能保证一个头文件不被多个文件需求,这个时候可能就出像嵌套的使用同一个头文件,这个时候宏定义就起到了作用,当一个头文件还生效的时候,如果你再次使用头文件那么,头文件中的函数就不会重复定义,这样就不会莫名出现奇怪的问题,你就可以放心使用头文件,而不担心报错。
其实导致这个问题的出现也是因为C语言过于的自由,像更多的高级语言是直接禁止头文件循环调用的。
所以在C语言中为了解决这个问题,在编写头文件的时候一定要加上特定的宏定义,这这会让你剩很多事。
那么对于这个几个文件将要如何进行编译那?
如果使用的是dev-C++就不能进行单个文件的编译,这样编译一定是会出错的,因为你编译的并不是一个工程,每个文件之间没有关联,那么要不你创建工程,在工程中进行编译,要么就使用命令进行编译。
如果你在windows环境下没有GCC编译器(我想那也不能)就用这个命令,"cl" 首先要保证所有的文件都在同一个文件夹下,然后打开cmd命令 打开代码所在的文件夹,
只对所有的C文件进行操作就可以 不要对h文件进行操作,会出现链接错误,
先将所有的c文件生成obj文件 目标文件。然后对目标文件进行链接就可以生成你最后想要的exe文件。
当然最好编译还是使用GCC的,如果你用过我想你一定会爱上它的。
gcc直接加上代码文件进行编译,可带参数:
1 gcc code.c -o hello //默认的情况下会生成一个叫a.out的可执行文件 -o 可以生成 -o 后名称的可执行变量 2 gcc code.c -g //加入 -g 参数是可以进行gdb调试的参数 3 gcc code.c -S //对代码进行编译生成一个 .s 的汇编文件 4 gcc code.c -c //生成 .o 的目标文件是不可以直接打开的二进制代码