user5805283
user5805283

Reputation:

Circular header dependency

I am stuck on (what i think is) a circular dependency problem in VS2017 coding in c.

I tried looking up the problem, and found a lot of similar problems on stackoverflow, but I can't seem to get my problem solved with those questions.

My code:

main.c

#include <stdio.h>
#include "travelers.h"
#include "trip.h"

int main(void) {

    int nTravelers = 0;
    int nTrips = 0;

    Traveler *travelersArray = (Traveler*)calloc(nTravelers, sizeof(Traveler));
    Trip *tripsArray = (Trip*)calloc(nTrips, sizeof(Trip));

    return 0;
}

travelers.h

typedef struct {
    unsigned int id;
    char *name;
    char *adress;
    char *residence;
} Traveler;

trip.h

typedef struct {
    unsigned int id;
    char *touringCar;
    char *destination;
    char *date;
    Traveler *travelers;
    unsigned int amount;
} Trip;

the travelers.c and trip.c files are only contain #include "travelers.h"/#include "trip.h"

The error occurs only in trip.h at Traveler *travelers;:

Error(s)

I don't know how to resolve this.

This looks like the same problem, but I couldnt translate it to my code.

Any help is apriciated.

Upvotes: 0

Views: 118

Answers (2)

alk
alk

Reputation: 70971

No cycles here.

If trip.c includes trip.h is shall also include travelers.h as its definitions (Trip) depends on the latter (Traveller).


Knowing this, one could include travelers.h into trip.h. Still, this complicates things, so it is a good idea to 1st of all add to every header so call header-guards, protecting against duplicate definitions on pre-processor level.

Doing so made the headers look like this:

travelers.h

#ifndef TRAVELERS_H
#define TRAVELERS_H

typedef struct {
    unsigned int id;
    char *name;
    char *adress;
    char *residence;
} Traveler;


#endif  // #ifndef TRAVELERS_H

trip.h

#ifndef TRIP_H
#define TRIP_H

#include "travelers.h"  // makes including it unnecessary where trip.h is included

typedef struct {
    unsigned int id;
    char *touringCar;
    char *destination;
    char *date;
    Traveler *travelers;
    unsigned int amount;
} Trip;


#endif // #ifndef TRIP_H

Upvotes: 1

Serge Ballesta
Serge Ballesta

Reputation: 149125

As a remark, the error is caused by the typedef. C accepts opaque structs provided you do not need their implementation details:

a.h:

struct A {
        int aVal;
        const char * astr;
};

a.c:

#include "a.h"

const char *getAStr(struct A*a) {
        return a->astr;
}

b.h

const char *getName(struct B*);

struct B {
        int bVal;
        struct A *a;
};

b.c

#include "b.h"

const char *getAStr(struct A*);

const char * getName(struct B* b) {
        return getAStr(b->a);
}

main.c

#include <stdio.h>
#include "a.h"
#include "b.h"

int main() {
        struct A a = { 1, "foo" };
        struct B b = { 2, &a };

        printf("%d - %d : %s\n", b.bVal, b.a->aVal, getName(&b));
        return 0;
}

compiles and links without even a warning while in b.c nothing is known on struct A except that it is a struct.

Upvotes: 0

Related Questions