符号和杂项

C 标准说 #include <header.h>#include "header.h" 符号之间的差别很小。

[#include <header.h>]搜索一系列实现定义的位置,以查找由 <> 分隔符之间的指定序列唯一标识的标头,并使标头的整个内容替换该指令。如何指定位置或标识的标头是实现定义的。

[#include "header.h"]导致由 分隔符之间的指定序列标识的源文件的全部内容替换该伪指令。以实现定义的方式搜索指定的源文件。如果不支持此搜索,或者搜索失败,则会重新处理该指令,就好像它已读取[#include <header.h>] …

因此,双引号形式可能看起来比角括号形式更多的地方。该标准通过示例指定标准头应该包含在尖括号中,即使编译在你使用双引号时也能正常工作。同样,POSIX 等标准使用角度括号格式 - 你也应该这样做。为项目定义的标题保留双引号标题。对于外部定义的标题(包括项目所依赖的其他项目的标题),角括号表示法是最合适的。

请注意,#include 和标题之间应该有一个空格,即使编译器不会在那里接受空格。空间很便宜。

许多项目使用如下符号:

#include <openssl/ssl.h>
#include <sys/stat.h>
#include <linux/kernel.h>

你应该考虑是否在项目中使用该命名空间控件(这可能是一个好主意)。你应该避开现有项目使用的名称(特别是 syslinux 都是不好的选择)。

如果你使用它,你的代码在使用符号时应该小心和一致。

不要使用 #include "../include/header.h" 表示法。

如果定义变量,头文件应该很少。尽管你将全局变量保持在最小值,但如果需要全局变量,则将其标头声明并在一个合适的源文件中定义,并且该源文件将包含用于交叉检查声明和定义的标头,以及使用该变量的所有源文件都将使用标头来声明它。

推论:你不会在源文件中声明全局变量 - 源文件只包含定义。

头文件应该很少声明 static 函数,除了 static inline 函数之外,如果在多个源文件中需要该函数,它将在头文件中定义。

  • 源文件定义全局变量和全局函数。
  • 源文件不声明全局变量或函数的存在; 它们包括声明变量或函数的标头。
  • 头文件声明全局变量和函数(以及类型和其他支持材料)。
  • 头文件不定义变量或除(staticinline 函数之外的任何函数。

交叉引用