1.头文件创建一个函数但源文件未实现该函数,会出现bug吗?

  • 函数未被使用:编译和链接时都不报错

  • 函数被使用:编译不报错,链接时报错(特殊情况:函数为内联函数时,编译和链接都报错)

  • 若为模板函数(需要在头文件中声明和定义),需要在编译期进行模板实例化,会在编译期报错

2.头文件循环包含问题

  • 当类/结构体仅被用作指针和引用时,不用包含完整定义,用前置声明替代头文件包含,示例如下:
1
2
3
4
5
6
7
8
9
10
//A.h
class B;// 前置声明
class A{
B* b;// 或B &b;
}

//class A;
class B{
A* a;
}

但在源文件中需要包含具体头文件

  • 解决重复包含问题:使用 头文件保护宏 或 #pragma once
1
2
3
4
5
//A.h
#ifndef A_H
#define A_H
···
#endif
  • 解决依赖扩散问题:使用Pimpl解决