2012-06-15 1 views
1

Так что я morelikely работает в перекрестных ссылок вопроса в CC кросс структура/функция ссылки

Здравствуйте, (я не смог записать его в первый по какой-то причине)

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

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) 
{ 
} 

производить follwing ошибки на VC2010:

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

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

'В' и т.д.

так, так как я только указатель А в FUNC (А * а) Я стараюсь делать опережающее объявление как это:

#pragma once 

typedef struct A; 

typedef struct 
{ 
    int field; 
}B; 

void func(A* a); 

и добавить #include «structA.h» в structB.c

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

Но в этом случае я потерять цель typedef-my моих структур ...

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

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

+0

В чем проблема? 'func' принимает указатель на' A'. Он может быть в 'structA.h'. Почему вы хотите заставить его «structB.h»? Похоже, что это будет иметь смысл в 'structA.h' из того, что вы опубликовали. Может быть, если вы поместите фактические имена вместо сделанных имен, таких как 'structA' и' structB', было бы более очевидно, что вы пытаетесь сделать? – user1118321

+0

В моем случае B представляет игрока, а func - для updatePlayer(), для этого требуется указатель Game (A), в котором содержится несколько полезных сведений для обновления проигрывателя, а также в том, что Game-структура удерживает игрока. – Samir

ответ

2
typedef struct structA; 

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

typedef struct A A; 
+0

Неплохо, это была проблема с копией/вставкой, предполагалось быть typedef struct A; Однако ваша коррекция не работает: переопределение; разные базовые типы см. декларацию 'A' – Samir

+0

Вы уверены, что не пытаетесь скомпилировать код C с помощью компилятора C++? –

+0

Как я могу сказать?Я использую VS2010 Я считаю, что он компилирует оба прекрасных ... – Samir