#ifndef _TEST_H_
#define _TEST_H_
int i = 10;
#define _TEST_H_
int i = 10;
#endif
想当然觉得这个是不会又问题了,加了条件编译了嘛。事实上链接时候就会出现重复定义错误。
如果只是int i;则在linux,gcc下不会报错,因为这被认为是一个声明。
C/C++的编译模式是单文件编译的,即TestHead1.c和TestHead2.c会分别编译,这两个文件分别编译的时候,其实都不存在_TEST_H_,因此两者都定义了int i = 10,造成重复定义。
由于工程中的每个.c文件都是独立的解释的,即使头文件有
#ifndef _TEST_H_
#define _TEST_H_
....
#enfif
在其他文件中只要包含了test.h就会独立的解释,然后每个.c文件生成独立的标示符。在编译器链接时,就会将工程中所有的符号整合在一起,由于文件中有重名变量,于是就出现了重复定义的错误。
解决方法大家都知道了,就.c中定义int i= 10;.h中声明 extern int i;
总结,头文件中只声明,千万不要有定义。
未完待续,等研究函数和类型定义