Перекрестная ссылка структуры/функции C

Так что я, скорее всего, столкнулся с проблемой перекрестных ссылок в C

Здравствуйте (почему-то не смогла написать сначала)

В основном этот код:

structA.h:

#pragma once

#include "structB.h"

typedef struct
{
    B b;
}A;

structB.h:

#pragma once

#include "structA.h"

typedef struct
{
    int field;
}B;

void func(A* a);

structB.c:

#include "structB.h"

void func(A* a)
{
}

Выдает следующие ошибки на VC2010:

structa.h(7): ошибка C2016: C требует, чтобы структура или объединение

хотя бы один элемент structa.h(7): ошибка C2061: синтаксическая ошибка: идентификатор

"Б" и т.д.

поэтому, поскольку у меня есть только указатель на A в func(A* a), я пытаюсь сделать предварительное объявление следующим образом:

#pragma once

typedef struct A;

typedef struct
{
    int field;
}B;

void func(A* a);

и я добавляю #include "structA.h" в structB.c

Однако это не работает, чтобы исправить мне нужно изменить параметр func(A* a) на func(struct A* a) в прототипе и реализации...

Но в этом случае я теряю цель определения типов моих структур...

Я знаю, что могу просто переместить функцию в другой файл, но эта функция связана с моей структурой, поэтому я хотел бы сохранить прототип в том же файле, что и моя структура. Теперь, возможно, это не очень хороший способ делать что-то на C, я в основном привык к C++, поэтому я склонен думать на C++, когда делаю C, что часто проблематично...

Кто-нибудь знает обходной путь? Большое Вам спасибо.


person Samir    schedule 15.06.2012    source источник
comment
В чем проблема? func принимает указатель на A. Это может быть в structA.h. Почему вы хотите заставить его structB.h? Кажется, что в structA.h будет больше смысла из того, что вы опубликовали. Может быть, если вы поместите настоящие имена вместо выдуманных имен, таких как structA и structB, будет более очевидно, что вы пытаетесь сделать?   -  person user1118321    schedule 15.06.2012
comment
По сути, в моем случае B представляет игрока, а func для updatePlayer(), он принимает указатель Game (A), который содержит несколько полезных сведений для обновления игрока, и структура Game содержит игрока.   -  person Samir    schedule 15.06.2012


Ответы (1)


typedef struct structA;

Как это вообще скомпилировалось? -- Правильно:

typedef struct A A;
person Community    schedule 15.06.2012
comment
Плохо, это была проблема с копированием/вставкой, предполагалось, что это typedef struct A; Однако ваше исправление тоже не работает: переопределение; различные базовые типы см. декларацию «A» - person Samir; 15.06.2012
comment
Вы уверены, что не пытаетесь скомпилировать код C с помощью компилятора C++? - person ; 15.06.2012
comment
Итак, после дальнейших исследований я пришел к выводу, что это не сработает, если я объявлю свою структуру как this typedef struct { }MyStruct; Мне нужно объявить как: typedef struct MyStruct MyStruct; структура MyStruct {}; И чтобы ваша поправка сработала, H2CO3. Я не знал, что это первое использование struct может привести к такой проблеме, я думаю, что второе чище. так как я еще не могу ответить на свой вопрос, я отмечу ваш как хороший. и извините, я не могу помещать блоки кода в комментарии :((, может быть, вы можете написать это для меня в качестве ответа. В любом случае спасибо. - person Samir; 15.06.2012
comment
Спасибо, что приняли. Вы можете поместить блоки кода в комментарии, заключив их в обратные кавычки: int i = 0; - person ; 15.06.2012