1、问题描述
如果定义了头文件A.h,B.h和源文件C.cpp。如果我们在A.h中写上一个函数,在B.h中include A.h,然后再在C.cpp中include A.h和B.h,这样我们就会出现重复定义的问题。
2、解决方法
重定义问题的原因往往是头文件的重复包含,常规解决方法如下:
- 条件编译
该方法的原理是在当编译器遇到第2(3,....)遍同样的头文件时,因为已经编译了一次,在后面在遇到的时候,编译器自动忽略文件中的内容。
#ifndef ...
#define ...
#endif ...
- #pragma once
3、其他情况
#ifndef...#endif 和 #pragma once 并不能完全消除所有的重定义问题。
重定义问题可能会出现在编译环节和链接环节。
- 编译环节:条件编译定义宏,防止某个cpp文件多次包含同一个.h(直接/间接),保证编译环节不会出现重复头文件。
- 链接环节:如果在头文件中定义了变量(该做法是错误的!),在多个cpp文件中包含,编译时会有多个.o文件中有这个变量,所以在链接环节会出错。
建议:函数和变量最好在头文件中声明,cpp中定义。
参考:
https://www.cnblogs.com/geore/p/5803944.html
https://bbs.youkuaiyun.com/topics/391067362?page=1
https://blog.youkuaiyun.com/hust_sheng/article/details/50822410