CodeQL 文档

仅包含头文件

ID: cpp/include-non-header
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - maintainability
   - modularity
   - readability
   - external/jsf
Query suites:
   - cpp-security-and-quality.qls

单击查看 CodeQL 存储库中的查询

此规则查找包含非头文件(*.h、*.hpp)的 #include 预处理器指令。例外情况是定义模板类或函数的头文件。这些头文件可以包含实现文件,这些实现文件随后被视为头文件的一部分。包含源文件可能会创建不必要的庞大目标文件,还会暴露整个实现,而不仅仅是其接口(尤其是在 C 中,因为 C 的作用域关键字集有限)。

这些规则的例外情况是包含模板定义的文件。这些文件可以包含 .c.cpp 文件,这些文件包含模板的实现。只有在使用模板时才会为模板实际生成代码,因此它们的定义(不仅仅是声明)必须包含在使用模板的任何文件中。

建议

仅包含头文件。重构代码,将类声明和函数原型放到头文件,并将它们的定义放到源文件(*.c, *.cpp)文件中。

示例

#include <iostream.h> //correct: iostream.h is a header file
#include "implementation.c" //wrong: include header files only
...

参考

  • AV 规则 32,联合攻击战斗机空中车辆 C++ 编码标准。洛克希德·马丁公司,2005 年。

  • Scott Meyers。第 38 项,有效 C++:改进您的程序和设计的 50 种特定方法,第 2 版。Addison-Wesley,1998 年。

  • 头文件

  • ©GitHub, Inc.
  • 条款
  • 隐私