假设你有2个文件中定义如下图所示的相关结构:C递归头文件包含问题?
啊内容:
#include b.h
typedef struct A
{
B *b;
} A;
BH内容:
#include a.h
typedef struct B
{
A *a;
} B;
在这种这种情况下,这个递归包体问题,但2个结构必须指向其他结构,如何实现这一点?
假设你有2个文件中定义如下图所示的相关结构:C递归头文件包含问题?
啊内容:
#include b.h
typedef struct A
{
B *b;
} A;
BH内容:
#include a.h
typedef struct B
{
A *a;
} B;
在这种这种情况下,这个递归包体问题,但2个结构必须指向其他结构,如何实现这一点?
Google C/C++ guidelines suggests:
不要使用#include时预先声明就足以
那会意味着:
啊内容:
typedef struct B B;
typedef struct A
{
B *b;
} A;
bh内容:
typedef struct A A;
typedef struct B
{
A *a;
} B;
如果你喜欢的东西多了一点安全(但更长的时间来编译),你可以这样做:
A.H内容:
#pragma once
typedef struct A A;
#include "B.h"
typedef struct A
{
B *b;
} A;
湾h内容:
#pragma once
typedef struct B B;
#include "A.h"
typedef struct B
{
A *a;
} B;
您预先定义只有结构,以这种方式你仍然可以声明指针:
在a.h
:
typedef struct B_ B;
typedef struct A_
{
B *b;
} A;
注意我是如何使用的typedef
和struct标记不同的名字,以使它更清晰一点。
这将削减它在C:
typedef struct B B;
typedef struct A A;
struct A { B *b; };
struct B { A *a; };
您可以根据需要重新安排B
和A
。
不要#包括啊和bh,只是向前声明A和B.
啊:
struct B; //forward declaration
typedef struct A
{
struct B * b;
} A;
BH:
struct A; //forward declaration
typedef struct B
{
struct A * a;
} B;
你可能要考虑如何紧密耦合的类是。如果它们紧密结合,那么它们可能属于同一个标题。
注意:在.c
文件中,您需要#include
这两个文件中的a.h和b.h来执行诸如a->b->a
之类的操作。
只是为了我的好奇心,'#pragma once'是什么? – 2010-09-22 12:25:52
这是一种新的方法(几乎支持任何编译器)执行'#ifndef MY_HEADER_H__ #define MY_HEADER_H__ ...#endif'。这意味着如果你有#include“foo.h”两次,而foo.h有'#pragam once',它将只应用一次声明。否则你会遇到编译错误。 – Wernight 2010-09-22 12:29:05