3

我正在学习C,我不确定在哪里包含文件。基本上我可以.c在文件中或.h文件中执行此操作:

选项1

测试.h

int my_func(char **var);

测试.c

#include <stdio.h>
#include "test.h"
int my_func(char **var) {printf("%s\n", "foo");}
int main() {...}

选项 2

测试.h

#include <stdio.h>
int my_func(char **var);

测试.c

#include "test.h"
int my_func(char **var) {printf("%s\n", "foo");}
int main() {...}

使用选项 2,我只需要包含test.h在我需要库的任何.c文件中。我看到的大多数示例都使用选项 1

是否有一些一般规则何时做什么,或者这是个人喜好的问题?

4

7 回答 7

5

不要使用includes,你不需要。

我会选择“选项1”之类的东西。为什么是“类似”?因为我会为 . 创建一个单独的文件,main我会将所有声明保存.h.c.

当然,这两个选项都是有效的。

如果您只想在 中包含一个标头main,您可以创建一个仅包含includes 的标头文件 - 这是一种常见的做法。这样,您可以只包含一个标题,而不是多个标题。

于 2013-03-25T10:16:12.107 回答
3

我倾向于选择选项 1,因为循环依赖在选项 2 中会很快出现并咬住你,并且减少输入大小是保证更快编译时间的最佳方法。选项 2 倾向于将所有内容都包含在内,无论您是否真的需要它。

也就是说,最好尝试一下对构建项目有用的方法。硬性规定往往不适用于这类问题。

于 2013-03-25T10:16:04.670 回答
2

两个选项都是正确的。C 标准允许两种解决方案

必须制作所有 C 标准头文件,以便它们可以按任意顺序多次包含:

标准标题可以以任何顺序包含;每个都可以在给定范围内多次包含,与仅包含一次没有任何不同的效果

(来自预处理器 #ifndef

于 2013-03-25T10:14:42.037 回答
0

没有规则指定您遵循特定的时尚。即使您在 test.c 文件中包含/不包含在内,只要您将其包含在 test.h 文件中并将该 test.h 文件包含在 test.c 中,它也不会太麻烦。希望你清楚这一点。

这是因为,您有 #ifndef、#define、#endif 之类的预处理器指令。它们被称为Include 守卫。这些在 inbuild 头文件中使用。但是,当您包含您编写的文件时,请使用您的选项 2,或使用包含防护以确保安全。

包含警卫的工作方式如下。#ifndef 任何东西 #define 任何东西 .. .. .. #endif

因此,当您第一次包含时,ANYTHING 尚未定义。所以 ifndef 返回 true,然后 ANYTHING 被定义,等等......但是下一次如果你包含同一个文件(错误地) ifndef 将返回 false,因为现在定义了 ANYTHING,所以文件不会被包含一点也不。这种保护对于避免头文件中存在的变量重复声明是必要的。那会给你一个编译错误。

希望能帮助干杯

于 2013-03-25T12:54:01.953 回答
0

我更喜欢在 c 文件中使用包含。如果您的程序变得越来越大,您可能会忘记在一个头文件中包含某些内容,但它包含在您使用的另一个头文件中。通过将它们包含在 c 文件中,您在编辑其他文件时不会丢失包含。

于 2013-03-25T10:35:35.907 回答
0

我不认为有一个普遍的规则(从“语法”的角度来看,你的选择都是正确的并且会起作用)。通常所做的是在 .h 文件中包含库所需的头文件(如选项 1 所示),或者是因为在使用库时需要它们(从而避免始终包含相同的头文件集在你的 .c 文件中,这更容易出错),或者因为它们在 .h 文件本身中被提及(例如,如果你int32_t在 .h 文件的函数原型中使用 as 类型,你当然需要包括<stdint.h>在 .h 文件中)。

于 2013-03-25T10:18:41.430 回答
0

我更喜欢选项 1。我想知道我在项目中使用了什么,并且在很多时候,选项 1 在时间和效率上都比选项 2 更有效。

于 2013-03-25T11:27:00.673 回答