Так что я, скорее всего, столкнулся с проблемой перекрестных ссылок в 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, что часто проблематично...
Кто-нибудь знает обходной путь? Большое Вам спасибо.
func
принимает указатель наA
. Это может быть вstructA.h
. Почему вы хотите заставить егоstructB.h
? Кажется, что вstructA.h
будет больше смысла из того, что вы опубликовали. Может быть, если вы поместите настоящие имена вместо выдуманных имен, таких какstructA
иstructB
, будет более очевидно, что вы пытаетесь сделать? - person user1118321   schedule 15.06.2012