C - 我应该使用引号或括号将标题包含在单独的目录中吗

Foo*_*ron 5 c include c-preprocessor

src我有一个带有和目录的项目include。编译时,我include通过-I选项 ( gcc -Iinclude ...) 传递目录。

我应该使用双引号 ( ") 还是尖括号 ( <) 来包含我自己的头文件?


我试图寻找答案,发现这两个相互矛盾的陈述:

  1. 通过双引号包含相对于 c 文件的头文件。其他所有内容(包含路径中的头文件)都带有尖括号。-> 因此使用尖括号
  2. 包括带尖括号的标准标题。其他所有内容都用双引号引起来。-> 因此使用双引号

我认为陈述2更清楚。当包含带双引号的文件时,最明显的是它是我自己的标头。


我应该使用引号或括号来包含我自己的头文件吗?C 标准允许这两种可能性。那么最佳实践是什么?

Eri*_*hil 3

共同的约定是:

\n
    \n
  • 用于< \xe2\x80\xa6 >属于 C 实现一部分的头文件或项目外部的 platform\xe2\x80\x94headers,例如 C 标准库、Unix 或 Windows 头文件以及通常为您的开发环境安装的库的头文件。
  • \n
  • 用于" \xe2\x80\xa6 "属于项目一部分的标题。
  • \n
\n

这并不完全由C标准决定;这是一般做法的问题。对于每个分隔符选择,编译器都有一个查找标头的位置列表(搜索路径)。这些搜索路径通常旨在促进上述使用,但它们可以通过命令行开关、环境变量、系统设置和/或构建编译器时进行的设置进行自定义(取决于您使用的编译器)。

\n

以下是 C 标准在 C 2018 6.10.2 中对它们的描述。第 2 段说:

\n
\n

表单的预处理指令

\n

# include < h 字符序列 > new-line

\n

在一系列实现定义的位置中搜索由<>分隔符之间的指定序列唯一标识的标头,并导致用标头的整个内容替换该指令。如何指定位置或标识标头是实现定义的。

\n
\n

第 3 段说:

\n
\n

表单的预处理指令

\n

# include " q-字符序列 " 换行符

\n

导致将该指令替换为由 " 分隔符之间的指定序列标识的源文件的全部内容。以实现定义的方式搜索指定的源文件。如果不支持此搜索,或者搜索失败,该指令被重新处理,就像它读取一样

\n

# include < h-字符序列 > 换行符

\n

>具有与原始指令相同的包含序列(包括字符,如果有的话)。

\n
\n

请注意两者之间的一些差异:

\n
    \n
  • 括号形式的文本表示它搜索唯一标识的标头标识的标头。报价单的文本不包含单词 \xe2\x80\x9cuniquely\xe2\x80\x9d。这表明括号形式引用的所有标头都应该彼此不同,如果它们是旨在避免歧义的设计系统的一部分,您可能会想到这一点。
  • \n
  • 请注意,它表示第一种形式 \xe2\x80\x9c 搜索一系列实现定义的位置。\xe2\x80\x9d 这符合具有搜索标准头的位置列表的编译器。对于第二种形式,它使用\xe2\x80\x9c由指定序列标识的源文件。\xe2\x80\x9d 这符合使用引号之间的文本作为文件系统中的路径。
  • \n
\n

标准中的这段文本相当宽松,两者都允许实现定义的方法来识别文件,因此可以将其中一个延伸为与另一个相同(尽管看到编译器抱怨括号中命名的标头是很有趣的)不是唯一的),并且编译器配置选项足够广泛,您可以在项目中以任何一种方式使用每个选项。然而,通常最好遵守惯例。

\n