在C中使用包含的最佳实践

时间:2013-03-25 10:12:57

标签: c include

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

选项1

test.h

int my_func(char **var);

test.c的

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

选项2

test.h

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

test.c的

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

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

是否有一些通用规则何时做什么或这是个人偏好的问题?

7 个答案:

答案 0 :(得分:5)

不要使用include,你不需要。

我会选择“选项1”之类的东西。为什么“喜欢”?因为我要为main创建一个单独的文件,并且我会将所有声明保留在.h内,并将所有定义保留在相应的.c内。

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

如果您只想在main中包含一个标题,则只需创建一个仅包含include s的标题文件,这是一种常见做法。这样,您只能包含一个标题,而不是几个标题。

答案 1 :(得分:3)

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

也就是说,最好先尝试一下构建项目的方法。严格而快速的规则往往不适用于这类问题。

答案 2 :(得分:2)

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

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

  

标准标题可以包含在任何顺序中;每个都可以包括在内   在给定范围内不止一次,没有效果   只包括一次

(来自Preprocessor #ifndef

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

没有规定您遵循特定方式的规则。即使你在test.c文件中包含/不包含它,也不会太烦人,只要你将它包含在test.h文件中并在test.c中包含该test.h文件。希望你对此很清楚。

这是因为你有预处理器指令,如#ifndef,#define,#endif。他们被称为包括警卫。这些用于inbuild头文件。但是,当您包含由您编写的文件时,请使用您的选项2,或使用包含警卫来保证安全。

包括警卫的工作如下。  #ifndef任何事情  #define ANYTHING .. .. ..  #ENDIF

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

希望有所帮助 干杯