【问题标题】:Understanding headers and include了解标题和包含
【发布时间】:2016-01-06 09:40:26
【问题描述】:

我试图了解包含文件的多个定义实际上是如何协作的,有时是如何冲突的。所以我有一个自定义头文件file.h,其中一些函数在#include guard 中声明。示例:

#ifndef FILE_Ariew7OGJknw00
#define FILE_Ariew7OGJknw00

#include <stdlib.h>  //assume minimal

//interfaces of functions

#endif

现在我有几个问题。

1. 由于#include &lt;stdlib.h&gt; 已经包含在标题file.h 中,我不需要将它包含在我的file.c 中。因为file.c 包括file.h,其中包括stdlib.h。但是,当我在file.h 之后在.c 中包含&lt;stdlib.h&gt; 时,它仍然可以正常工作。为什么呢?喜欢:

#include <stdio.h>
#include "file.h"
#include <stdlib.h> 
//code

2.如果我这样做会发生什么:

#include <stdio.h>
#include <stdlib.h>
#include "file.h" 
//code

实际上什么都没有,但为什么不跳过 file.h 定义(或者是吗?)基于守卫,因为库 stdlib已经包括在内。

最后,一个更普遍的问题:为什么#include 守卫比#pragma once 使用更广泛,尽管后者有几个优点,例如:

• 更少的代码
• 避免名称冲突(即FILE_Ariew7OGJknw00
• 提高编译速度

【问题讨论】:

  • 标头不是库。而且 C 不声明库,而是声明函数和变量并定义类型。
  • @Olaf 是的。我编辑了它。

标签: c include header-files pragma include-guards


【解决方案1】:

但是,当我在我的 .c 中包含 file.h 之后,它仍然 工作正常。为什么会这样?

因为标准标题也包含保护。因此,当直接在您的代码中或通过另一个源文件将其包含多个时,它会被跳过。

为什么不跳过 file.h 定义(或者是它?)基于警卫, 因为 lib 已经被声明了。

包含守卫不检查是否包含任何标题。它不关心/不知道里面是什么。

预处理器只检查是否定义了包含保护宏FILE_Ariew7OGJknw00。如果已定义,则跳过。否则,它会粘贴到您包含它的源文件中。

为什么 #include 守卫甚至比 #pragma 更广泛使用 虽然后者有几个优点

这是非标准的。因此,它会降低您的代码的可移植性。


不建议在头文件中不必要地包含其他头文件。在实践中您不会看到多个包含问题,因为由于包含警卫,它会按预期工作。可能存在需要包含其他标头的合法情况。例如,如果您有这样的标题:

/* header.h */

#ifndef MY_HEADER_H
#define MY_HEADER_H

#include<stdio.h>

struct my_struct {
   size_t len;
   char *s;
};

void my func(void);
void my_blah(int);

#endif

然后有必要包含&lt;stdio.h&gt; 以获得size_t 定义。如果您不这样做,那么包含此标头的源文件将必须包含&lt;stdio.h&gt;。但是一个标头应该是独立工作的,而不是强迫它的用户知道所有的依赖关系。

按照惯例,头文件应该只包含声明,并且其中包含的其他头文件应该是最少的。

【讨论】:

    【解决方案2】:

    1。 语言标准要求标准标题可以包含多次而不会出现问题。它并没有确切说明如何工作,但包含警卫当然是一种方式。

    3。 #pragma once 的一个问题是它是非标准的。标准委员会不想准确定义它应该如何在所有可能的文件系统上工作,对于所有可能的操作系统。如果您有多个来自未知来源的网络挂载和一些硬链接文件,则可能很难确定哪些文件是相同的。

    在 Windows 和 Linux 上,它适用于所有主要编译器。在其他系统上,我们不知道。

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 2011-10-10
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 2015-08-16
      相关资源
      最近更新 更多