#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;
总结,头文件中只声明,千万不要有定义。
未完待续,等研究函数和类型定义
本文深入探讨了C/C++编程中头文件导致重复定义错误的原因,并提供了有效的解决策略。通过实例说明,在多个文件中包含同一个头文件可能导致变量或函数的重复定义,从而引发编译错误。文章强调了正确使用头文件的重要性,提倡在头文件中仅进行声明而非定义,以避免此类问题的发生。
402

被折叠的 条评论
为什么被折叠?



