1、目录结构:
/base
/main
main.cpp
CMakeLists.txt
/test1
test.h
2、文件内容:
2.1、不加头文件保护:多次包含重定义问题
// main.cpp
#include "test.h"
#include "test.h"
int main()
{
func();
return 0;
}
// CMakeLists.txt
include_directories(${CMAKE_SOURCE_DIR}/test1)
// test1/test.h
#include <iostream>
void func()
{
std::cout << "in file test1/test.h" << std::endl;
}
// 输出:
error: redefinition of 'void func()'
2.1、加头文件保护:不存在问题
// main.cpp
#include "test.h"
#include "test.h"
// 多次包含
int main()
{
func();
return 0;
}
// CMakeLists.txt
include_directories(${CMAKE_SOURCE_DIR}/test1)
// test1/test.h
#ifndef TEST1_TEST
#define TEST1_TEST
#include <iostream>
void func()
{
std::cout << "in file test1/test.h" << std::endl;
}
#endif
// 输出:
in file test1/test.h
总结:
1、实际工作中肯定会出现头文件多级嵌套包含的场景,不可避免的存在同一头文件多次包含问题,因此必须对每一个头文件加宏定义保护。
2、加入头文件保护后,cpp文件在导入.h文件时,只会导入一次,第二次直接略过,因此不存在问题。
参考资料:
1、如果C源文件包含两个同名的头文件,将会发生什么?