C语言中的头文件定义头
C语言里面经常看别人写的头文件:
#ifndef C_CLIENT_H_
#define C_CLIENT_H_XXXX
#endif
XXX为真实的头内容,一直不大懂为何要加#ifndef C_CLIENT_H_这样的内容,其中C_CLIENT_H_大概是和自己的.h文件同名的一个大写标识。于是搜了一下,此种做法是为了解决,在同一个.C文件中包含多个头文件时,这多个头文件存在重复定义,从而导致编译时出现重复定义问题。比如我们有2个头文件,第一个是test.h:
第二个是test1.h,将test.h头文件包含进去了,这种在大型工程中极有可能发生。
在一个main.c文件中,没注意将test.h和test1.h全部包含进去了,此时进行编译,预编译时,头文件会在.c文件中进行展开,于是i这个变量在main.c文件中被定义了2次,则会报错:
即重定义问题,报错中提示用#ifdef 或者#pragma规避此问题。如果在.h文件之前加上条件编译的宏语句,那么则不会出现此问题。所以,养成良好的习惯非常重要,在定义头文件的时候,都需要加上类似的结构:
不过此种做法实则只能解决单个C文件的重复定义问题,在实际工程开发中,往往是多个C文件的,在不同的C文件是分别进行编译的,所以一个C语言里的#ifndef对另一个C文件不起作用的,比如同时在test.c和main.c文件中包含了test.h文件,此时工程编译时,单个文件往往都能通过,但是到了链接的时候,又会报错,重复定义问题。
综合以上,感觉最根本的方法还是养成良好的习惯:
1)在头文件里只声明不定义
2)把定义定义在C文件里
才能规避此类问题。