循环标头依赖

时间:2018-01-04 15:22:23

标签: c visual-studio circular-dependency

我坚持认为(我认为是)在VS2017编码中的循环依赖问题。

我尝试查找问题,并在stackoverflow上发现了很多类似的问题,但我似乎无法通过这些问题解决我的问题。

我的代码:

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;

travelers.ctrip.c个文件仅包含#include "travelers.h" / #include "trip.h"

错误仅发生在trip.h的{​​{1}}:

Error(s)

我不知道如何解决这个问题。

This看起来像是同一个问题,但我无法将其转换为我的代码。

任何帮助都是有帮助的。

2 个答案:

答案 0 :(得分:2)

这里没有周期。

如果trip.c包含trip.h,则还应包含travelers.h,因为其定义(Trip)取决于后者(Traveller)。

了解这一点,可以将travelers.h纳入trip.h。尽管如此,这使事情变得复杂,因此最好首先添加每个标题,以便调用标题保护,以防止在预处理器级别上出现重复定义。

这样做会使标题看起来像这样:

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

答案 1 :(得分:1)

作为评论,错误是由typedef引起的。 C接受 opaque 结构,前提是您不需要它们的实现细节:

A.H:

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

交流转换器:

#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;
}

在b.c中编译和链接时甚至没有警告。struct A 除了之外没有任何信息表明它是一个结构。