-2

我试图弄清楚如何将 C 头文件与#ifndef 和#include 一起使用。假设我有这两个头文件:

标头A.h:

#ifndef HEADERA_H
#define HEADERA_H

#include "headerB.h"

typedef int MyInt;
TFoo foo;
... some other structures from headerB.h ...

#endif

标头B.h

#ifndef HEADERB_H
#define HEADERB_H

#include "headerA.h"

typedef struct foo{
    MyInt x;
} TFoo;

#endif

标头A.c

#include "headerA.h"

... some code ...

标头B.c

#include "headerB.h"

... some code ...

编译 headerB.c 时,它说

In file included from headerB.h,
                 from headerB.c:
headerA.h: error: unknown type name ‘MyInt’

我认为,这是因为在headerB.h编译时,它定义了HEADERB_H,然后,当headerA.h想要包含headerB.h时,#ifndef HEADERA_His false = 跳过包含。

这里的最佳做法是什么?我刚刚读到,最佳做法是#include在头文件中执行所有指令,但在这种情况下它看起来像一个问题。

编辑:好的,很抱歉误导你。这只是来自具有更多文件的更大项目的示例。

4

2 回答 2

1

你有一个循环依赖。头文件headerA.h依赖headerB.h哪个依赖headerA.h等等等等。

您需要打破这种依赖关系,例如包括headerB.hheaderA.h. 不需要(headerA.h不需要任何东西headerB.h)。


如果您必须包含headerB.h(如您最近的编辑中所述),那么您首先应该重新考虑如何使用您的头文件,以及您将什么定义放在哪里。也许移动MyIntto的定义headerB.h?或者有更多的头文件,比如一个用于类型别名(比如MyInt我个人认为没有用的),一个用于结构,一个用于变量声明?

如果那不可能,那么您可以尝试更改定义的顺序和包含,例如

#ifndef HEADERA_H
#define HEADERA_H

// Define type alias first, and other things needed by headerB.h
typedef int MyInt;

// Then include the header file needing the above definitions
#include "headerB.h"

TFoo foo;
... some other structures from headerB.h ...

#endif
于 2016-11-16T10:18:57.223 回答
0

只需放下线

#include "headerB.h"

从文件头A.h

于 2016-11-16T10:22:19.730 回答