我应该在标题中使用#include吗?

时间:2009-11-26 15:55:02

标签: c c-preprocessor file-organization

是否需要#include某个文件,如果在标题(* .h)中,使用此文件中定义的类型?

例如,如果我使用GLib并希望在我的标题中定义的结构中使用gchar基本类型,是否有必要执行#include <glib.h>,因为我知道我已经拥有它* .c文件?

如果是,我还必须将其放在#ifndef#define之间或#define之后吗?

9 个答案:

答案 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函数原型。