【问题标题】:C - Should I use quotes or brackets to include headers in a separate directoryC - 我应该使用引号还是方括号将标题包含在单独的目录中
【发布时间】:2021-01-13 11:05:14
【问题描述】:

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

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


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

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

在我看来,陈述 2 更清楚。当包含一个带双引号的文件时,最明显的是它是我自己的标题。


我应该使用引号还是括号来包含我自己的头文件? The C standard allows both possibilities。那么最佳做法是什么?

【问题讨论】:

  • “两个相互冲突的陈述”——不过,它们似乎并不冲突。他们都说你应该用双引号包含你的标题(假定它是你项目的一部分,因此相对于 C 文件),以及其他所有内容,包括标准标题, - 用尖括号。
  • 这个声明措辞很不幸。与您的 c 文件相关的意思是将其包含在 #include "../include/header.h" 中。所以声明 1 会说我应该用尖括号括起来
  • 选择是一种风格偏好。而且,与所有风格偏好一样,存在惯例和相互冲突的阵营。使用双引号。

标签: c include


【解决方案1】:

常见的约定是:

  • < … > 用于作为 C 实现或平台一部分的标头 - 项目外部的标头,例如 C 标准库、Unix 或 Windows 标头,以及通常为您的开发环境安装的库的标头。
  • " … " 用于项目中的标头。

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

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

表单的预处理指令

#include<h-char-sequence>new-line

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

第 3 段说:

表单的预处理指令

#include"q-char-sequence"换行

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

#include<h-char-sequence>换行

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

注意两者之间的一些区别:

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

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

【讨论】:

    【解决方案2】:

    考虑这个例子:

    +- include/
    |  |
    |  \- header.h
    |
    +- src/
       |
       \- main.c
    

    语句说要使用:

    #include "../include/header.h"
    
    gcc src/main.c
    

    或:

    #include <header.h>
    
    gcc -Iinclude src/main.c
    

    您决定使用哪种样式。我个人更喜欢第二种。但更重要的是在整个项目中使用一致的风格。

    【讨论】:

    • 您也可以执行 #include "header.h" 并将 -Iinclude 参数添加到 gcc 调用中。我的问题是我是否应该使用双引号而不是括号,所以很明显,标题与项目相关。
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 2022-11-09
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多