是否需要#include
某个文件,如果在标题(* .h)中,使用此文件中定义的类型?
例如,如果我使用GLib并希望在我的标题中定义的结构中使用gchar
基本类型,是否有必要执行#include <glib.h>
,因为我知道我已经拥有它* .c文件?
如果是,我还必须将其放在#ifndef
和#define
之间或#define
之后吗?
答案 0 :(得分:89)
答案 1 :(得分:19)
一个好的做法是,只有在包含文件需要时才将#includes放在包含文件中。如果给定包含文件中的定义仅用于.c文件,则仅将其包含在.c文件中。
在你的情况下,我会将它包含在#ifdef /#endif之间的包含文件中。
这将最大限度地减少依赖关系,以便在包含文件更改时不必重新编译不需要给定包含的文件。
答案 2 :(得分:0)
通常,库开发人员会保护他们的包含多个包括#ifndef /#define / #endif“技巧”,所以你不必这样做。
当然,你应该检查......但是无论如何编译器会在某个时候告诉你;-)无论如何,检查多个包含是一个很好的做法,因为它会减慢编译周期。
答案 3 :(得分:0)
只需在项目中的一个通用头文件中包含所有外部标题,例如 global.h 并将其包含在所有c文件中:
它看起来像这样:
#ifndef GLOBAL_GUARD
#define GLOBAL_GUARD
#include <glib.h>
/*...*/
typedef int YOUR_INT_TYPE;
typedef char YOUR_CHAR_TYPE;
/*...*/
#endif
此文件使用include guard来避免多个包含,非法多重定义等。
答案 4 :(得分:0)
在编译期间,预处理器只是用指定的文件内容替换#include指令。 为防止无限循环,应使用
#ifndef SOMEIDENTIFIER
#define SOMEIDENTIFIER
....header file body........
#endif
如果某个标头包含在您的文件中包含的另一个标头中 而不必再次明确地包含它,因为它将以递归方式包含在文件中
答案 5 :(得分:0)
是的,这是必要的,或者编译器在尝试编译它没有“意识到”的代码时会抱怨。想想#include是编译器的提示/推动/弯曲,告诉它接收声明,结构等以便成功编译。 jldupont指出的#ifdef /#endif头技巧是为了加快代码的编译。
它用于你有一个C ++编译器并编译纯C代码的实例,如下所示
这是一个技巧的例子:
#ifndef __MY_HEADER_H__ #define __MY_HEADER_H__ #ifdef __cplusplus extern "C" { #endif /* C code here such as structures, declarations etc. */ #ifdef __cplusplus } #endif #endif /* __MY_HEADER_H__ */
现在,如果多次包含它,编译器将只包含一次,因为符号__MY_HEADER_H__
被定义一次,这加快了编译时间。
注意上面例子中的符号cplusplus,如果你有一个C代码,这是处理C ++编译的常规标准方法。
我已将上述内容包括在内(尽管与海报的原始问题并不相关)。 希望这可以帮助, 最好的祝福, 汤姆。
PS:很抱歉让任何人对此进行投票,因为我认为这对于C / C ++的新手来说是有用的。发表评论/批评等,因为他们是最受欢迎的。
答案 6 :(得分:0)
您需要在标题中包含标题,并且不需要将其包含在.c中。包含应该在#define之后,因此它们不会被多次包含在内。例如:
/* myHeader.h */
#ifndef MY_HEADER_H
#define MY_HEADER_H
#include <glib.h>
struct S
{
gchar c;
};
#endif /* MY_HEADER_H */
和
/* myCode.c */
#include "myHeader.h"
void myFunction()
{
struct S s;
/* really exciting code goes here */
}
答案 7 :(得分:0)
我使用以下构造来确保在此包含之前包含所需的包含文件。我只在源文件中包含所有头文件。
#ifndef INCLUDE_FILE_H
#error "#include INCLUDE.h" must appear in source files before "#include THISFILE.h"
#endif
答案 8 :(得分:-1)
我通常做的是制作一个包含所有必要依赖项的包含文件。所以我可能会:
#ifndef _PROJECT_H_
#define _PROJECT_H_
#include <someDependency.h>
#include "my_project_types.h"
#include "my_project_implementation_prototypes.h"
#endif
所有在project.h中。现在project.h可以包含在没有订单要求的任何地方,但我仍然可以在不同的标题中使用我的依赖项,类型和API函数原型。