C语言中头文件的组织也需要遵循一定的规则,这样才能保证程序结构的清晰。最基本的要求是一个头文件中的东西不要太多。如果程序比较小,所有的常量定义、全局变量定义、结构定义、函数声明放在一个头文件中是可行的;反之则需要划分为多个文件存放。常用的规则包括: 1、在每个头文件中加上如下的定义:(假设头文件的名字为MyDemo.h)
#ifndef MY_DEMO_H
#define MY_DEMO_H
#endif // MY_DEMO_H
这样有助于消灭头文件被多次include导致的错误。
2、对于全局变量,自然要尽可能少用。如果系统实在需要使用全局变量,就应该遵循一般的用法:在逻辑相关的源文件中定义全局变量,在头文件中进行声明,而不要将定义放到源文件中。 下面这个办法是我为了处理某个老项目而采用的,正常情况下最好不要使用。如果你想将全局变量统一进行管理,可以用一个单独的文件存放全局变量的定义。例如MyVariable.h,其内容如下: #ifndef MY_VARIABLE_H
#define MY_VARIABLE_H
int gMyInt;
short gMyShort;
#endif // MY_VARIABLE_H
但是这样的定义可能会导致严重的问题,它不允许在多个源文件中include MyVariable.h。我们只能也只需要在一个源文件中include MyVariable.h,而在其他源文件中只能采用extern int gMyInt这样的形式来声明,这可以另外定义一个和MyVariable.h对应的头文件XMyVariable.h来定义这些extern int gMyInt。可是这种方法需要将变量在声明一遍,麻烦不说,还容易产生不一致。其实可以简单地解决这个问题:
#ifndef MY_VARIABLE_H
#define MY_VARIABLE_H
#ifndef MY_NO_EXTERN
#define MY_EXTERN extern
#else
#define MY_EXTERN
#endif // MY_NO_EXTERN
MY_EXTERN int gMyInt;
MY_EXTERN short gMyShort; #endif // MY_VARIABLE_H
这下子可以在所有的源文件中include MyVariable.h了,不过需要在其中一个文件中先定义MY_NO_EXTERN,然后再include,以保证变量被定义过一次:
#define MY_NO_EXTERN
#i nclude MyVariable.h
3、函数的声明需要考虑C和C++混用的情况。我经常用C写一些底层的代码,然后用C++(多半是VC++)来做界面,并调用底层的C函数。例如:
#ifndef MY__H
#define MY__H
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
int MyFunc(int, char *);
#ifdef __cplusplus
}
#endif // __cplusplus #endif // MY__H |