我正在学习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 。
是否有一些通用规则何时做什么或这是个人偏好的问题?
答案 0 :(得分:5)
不要使用include
,你不需要。
我会选择“选项1”之类的东西。为什么“喜欢”?因为我要为main
创建一个单独的文件,并且我会将所有声明保留在.h
内,并将所有定义保留在相应的.c
内。
当然,这两个选项都是有效的。
如果您只想在main
中包含一个标题,则只需创建一个仅包含include
s的标题文件,这是一种常见做法。这样,您只能包含一个标题,而不是几个标题。
答案 1 :(得分:3)
我更倾向于选择选项1,因为循环依赖会在选项2中快速出现,并且减少输入大小是保证更快编译时间的最佳方法。无论您是否真的需要,选项2都倾向于将所有内容都包括在内。
也就是说,最好先尝试一下构建项目的方法。严格而快速的规则往往不适用于这类问题。
答案 2 :(得分:2)
这两个选项都是正确的。 C标准允许两种解决方案
必须制作所有C标准标题,以便它们可以按任何顺序包含多次:
标准标题可以包含在任何顺序中;每个都可以包括在内 在给定范围内不止一次,没有效果 只包括一次
答案 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因此不会包含该文件一点都不这种保护是必要的,以避免头文件中存在的变量的重复声明。这会给你一个编译错误。
希望有所帮助 干杯