gpt4 book ai didi

c - 了解 header 和包含

转载 作者:行者123 更新时间:2023-11-30 18:38:11 25 4
gpt4 key购买 nike

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

#ifndef FILE_Ariew7OGJknw00
#define FILE_Ariew7OGJknw00

#include <stdlib.h> //assume minimal

//interfaces of functions

#endif

现在我有几个问题。

1.#include <stdlib.h>已包含在 header file.h 中,我不需要将其包含在我的 file.c 中。因为file.c包括file.h其中包括stdlib.h 。但是当我包括<stdlib.h>时之后file.h在我的.c ,它仍然可以正常工作。为什么会这样?喜欢:

#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 更广泛使用尽管后者有几个优点,例如:

• less code
• avoidance of name clashes (i.e. FILE_Ariew7OGJknw00)
• improvement in compilation speed

最佳答案

However when I include after file.h in my .c, it still works properly. Why is that so?

因为标准 header 也包含防护。因此,当直接在代码中或通过另一个源文件多次包含它时,它会被跳过。

why isn't file.h definition skipped (or is it?) based on the guards, since the lib is already declared.

包含防护不会检查是否包含任何 header 。它不关心/不知道里面有什么。

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

Why are #include guards more widespread used than #pragma once even though the latter has several advantages

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

<小时/>

不建议在一个头文件中包含不必要的其他头文件。在实践中您不会看到多个包含问题,因为由于包含防护,它会按预期工作。在某些合法情况下,您可能需要包含其他 header 。例如,如果您有如下标题:

/* 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

然后就需要包含 <stdio.h>获取size_t定义。如果不这样做,那么包含此 header 的源文件将必须包含 <stdio.h> 。但是 header 应该独立工作,而不强制它的用户了解所有依赖项。

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

关于c - 了解 header 和包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34629833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com