我坚持认为(我认为是)在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.c
和trip.c
个文件仅包含#include "travelers.h"
/ #include "trip.h"
错误仅发生在trip.h
的{{1}}:
我不知道如何解决这个问题。
This看起来像是同一个问题,但我无法将其转换为我的代码。
任何帮助都是有帮助的。
答案 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
除了之外没有任何信息表明它是一个结构。