楼上好多说的都不错,不过我觉着都说的不完整,我最近也在写一个软件,不过不是MCU程序,而是计算机软件,其中N多模块,算到一起大概得有三十多个文件(包括源文件和头文件),我总结下我的写法。
假设一个程序有多个模块,那么每个模块一个 xx.c和一个xx.h对应,在xx.h中只声明函数和变量,对于在只在本模块中引用的变量或函数,不必在 xx.h中声明,而只在 xx.c中声明甚至可以不声明(只要你记得住),而在 xx.c 中具体定义。另外,对于全局各模块都要用到的宏定义之类的,可以单独写一个头文件,例如命名为:common.h,这样,需要引用哪个,就包含哪个头文件即可。在更改个别模块时,编译器也不会去把全部源文件都编译一遍。为了使编译器不会报类似“XX变量重定义”之类的错误,在每个头文件中声明全局唯一的宏定义来避免。
举例:如果有一项目中有 main,keyboard和display三个模块,则创建如下文件:
main.c
main.h
keyboard.c
keyboard.h
display.c
display.h
common.h
每个 xx.c文件包含对应的 xx.h文件、公用头文件(common.h)、引用到的其它模块的 xx.h和系统的库文件(如:stdio.h等),如果在某个模块的头文件中就已经需要common.h中的定义,也可以将其引用放在头文件中。在每个头文件中增加一个宏定义,以display.h为例:
//文件开头
#ifndef __DISPLAY_H__ //这个名字一般和模块名对应起来比较好,这样一般也不会重复,在VC的某些版本中,
//甚至使用了到了128位的GUID来保证这个名字的唯一性
#define __DISPLAY_H__
// 下面是你自己定义本模块中被外面引用的变量或/和函数的声明
extern int xxx;
......
extern void yyy( ... );
......
// 最后一行和第一行对应起来
#endif //#ifndef __DISPLAY_H__
这样就可以避免编译时的错误提示了。
这是C语言的写法,对于面向对象还有一种情况,类的继承,这时对应的是 xx.cpp和xx.h文件,在头文件中是类的定义,如果这个类是继承自另一个类,那么在头文件中就要引用另一个类的定义的头文件。不过我写MCU程序还没有用到,呵呵......
以上仅个人观点,也是从VC中学到的,谨供参考! |