циклично Включете зависимост, причиняваща проблеми, как да се реши?

Имам 2 заглавни файла, които трябва (?) да се включват един друг.

Първият

заглавие1.h

изглежда така:

#ifndef HEADER1_H
#define HEADER1_H

#include "header2.h"

typedef Needed_s
{
     size_t something;
} Needed_t;

typedef partialstruct_s
{
     size_t something;
     Needed_t *pointer;
} partialstruct_t;

void function (MyStruct_t Parameter);//<- this line gets the error

#endif

Второто

заглавие2.h

като този:

#ifndef HEADER2_H
#define HEADER2_H

#include "header1.h"

typedef MyStruct_s
{
     //struct partialstruct_s ThisOne;
     //I tryed both ways!
     partialstruct_t ThisOne;
} MyStruct_t;

#endif

Не харесвам този начин на работа, но също така не обичам да декларирам структури в различни заглавки, където те твърдят, че свързаните не принадлежат към тях.

Кодът е просто MCTR, така че, моля, не ми давайте съвети за подобрения.

Сега получавам грешката:

header1.h:17: грешка: очаквани спецификатори на декларация или '...' преди 'MyStruct_t'

Така че този проблем причинен ли е от зависимостта за включване? И ако е така, как мога да го реша?


person dhein    schedule 11.02.2014    source източник
comment
Ако две заглавки/библиотеки/модули/каквото и да е взаимно зависимо едно от друго, вероятно е грешка те да са отделни като начало.   -  person R.. GitHub STOP HELPING ICE    schedule 12.02.2014
comment
Но понякога целта на тяхното използване е тематично абсолютно различна. И от гледна точка на чистия код, не е грешка да гледате и тази тема.   -  person dhein    schedule 12.02.2014


Отговори (1)


Грешката на компилатора, която получавате, е просто резултат от включването на header2.h в .c файл. Това ще премине през приблизително следните стъпки

  1. определя HEADER2_H
  2. включва header1.h
  3. определя HEADER1_H
  4. включва header2.h, но тъй като HEADER2_H вече е дефиниран, това до голяма степен е без операция
  5. Сега обратно в header1.h компилаторът среща void function (MyStruct_t Parameter);

В този момент MyStruct_t не е дефиниран, защото header2.h все още не е обработен, следователно получавате указаната грешка на компилатора.

За съжаление наистина няма начин това да бъде разрешено с кода в заглавните файлове, както е дефинирано, поради цикличната зависимост.

  • header1.h зависи от пълното внедряване на MyStruct_t, което е в header2.h
  • header2.h зависи от пълното внедряване на partialstruct_t, което е header1.h

За да поправите това, ще трябва или да превключите един от заглавните файлове, за да използва указател, или да създадете трети заглавен файл, header0.h, който съдържа дефиницията на partialstruct_t

person JaredPar    schedule 11.02.2014
comment
изключването на partialstruct_t в друг заглавен файл не го реши за мен:/ - person dhein; 12.02.2014
comment
@Zaibis актуализирахте ли поръчката за включване, за да отразите новата разбивка? - person JaredPar; 12.02.2014
comment
@Zaibis и двете заглавия2 трябва да включват заглавие0, заглавие1 трябва да включват заглавие0 и заглавие2. header0 обаче ще се нуждае от предна декларация за Nested - person JaredPar; 12.02.2014
comment
добре, току-що поставих всички typedefs в header1 сега и направих в header2 коментариран typedef от тях с бележката къде да ги намеря и че не е възможно по различен начин. Благодаря все пак за помощта. - person dhein; 12.02.2014