gpt4 book ai didi

C头文件#ifndef#include错误

转载 作者:行者123 更新时间:2023-11-30 20:22:09 26 4
gpt4 key购买 nike

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

headerA.h:

#ifndef HEADERA_H
#define HEADERA_H

#include "headerB.h"

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

#endif

headerB.h

#ifndef HEADERB_H
#define HEADERB_H

#include "headerA.h"

typedef struct foo{
MyInt x;
} TFoo;

#endif

headerA.c

#include "headerA.h"

... some code ...

headerB.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想要包含< strong>headerB.h,#ifndef HEADERA_H 为 false = 跳过包含。

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

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

最佳答案

您有一个循环依赖。头文件 headerA.h 依赖于 headerB.h,而 headerB.h 又依赖于 headerA.h 等等。

您需要打破这种依赖性,例如headerA.h中包含headerB.h。不需要它(headerA.h 中的任何内容都不需要 headerB.h 中的任何内容)。

<小时/>

如果您必须包含 headerB.h (如您最近的编辑中所述),那么您首先应该重新考虑如何使用头文件,以及在何处放置什么定义。也许将 MyInt 的定义移至 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

关于C头文件#ifndef#include错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40629479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com