C проблема включения рекурсивного заголовка файла? - PullRequest
4 голосов
/ 22 сентября 2010

Предположим, у вас есть связанные структуры, определенные в 2 заголовочных файлах, как показано ниже:

a.h содержимое:

#include b.h

typedef struct A
{
  B *b;
} A;

b.h содержимое:

#include a.h

typedef struct B
{
  A *a;
} B;

В таком случае это рекурсивное включение является проблемой, но 2 структуры должны указывать на другую структуру, как это сделать?

Ответы [ 4 ]

4 голосов
/ 22 сентября 2010

Не включайте ах и бх, просто объявите вперед А и Б.

ах:

struct B; //forward declaration
typedef struct A
{
    struct B * b;
} A;

чч:

struct A; //forward declaration
typedef struct B
{
    struct A * a;
} B;

Вы можетехочу думать о том, насколько тесно связаны классы.Если они очень тесно связаны, то, возможно, они принадлежат одному и тому же заголовку.

Примечание: вам потребуется #include и ah, и bh в файлах .c, чтобы делать такие вещи, как a->b->a.

2 голосов
/ 22 сентября 2010

Рекомендации Google C / C ++ предлагают :

Не используйте #include, когда будет достаточно предварительного объявления

Это означало бы:

a.h содержание:

typedef struct B B;

typedef struct A
{
  B *b;
} A;

b.h содержание:

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;

b.h содержимое:

#pragma once
typedef struct B B;

#include "A.h"

typedef struct B
{
  A *a;
} B;
2 голосов
/ 22 сентября 2010

Вы предварительно определяете только структуру, так что вы все равно можете объявить указатель:

В a.h:

typedef struct B_ B;

typedef struct A_
{
  B *b;
} A;

Обратите внимание, как я использую отдельные имена для тегов typedef и struct, чтобы сделать его немного понятнее.

1 голос
/ 22 сентября 2010

Это сократит его в C:

typedef struct B B;
typedef struct A A;
struct A { B *b; };
struct B { A *a; };

Вы можете изменить порядок B и A по желанию.

...