我遇到的问题是C头文件中的循环依赖问题...环顾四周我怀疑解决方案与前向定义有关,但是虽然列出了许多类似的问题,但似乎没有提供信息我需要解决这个......
我有以下5个源文件:
// fwd1.h
#ifndef __FWD1_H
#define __FWD1_H
#include "fwd2.h"
typedef
struct Fwd1 {
Fwd2 *f;
}
Fwd1;
void fwd1 (Fwd1 *f1, Fwd2 *f2) ;
#endif // __FWD1_H
// fwd1.c
#include "fwd1.h"
#include "fwd2.h"
void fwd1 (Fwd1 *f1, Fwd2 *f2) { return; }
// fwd2.h
#ifndef __FWD2_H
#define __FWD2_H
#include "fwd1.h"
typedef
struct Fwd2 {
Fwd1 *f;
}
Fwd2;
void fwd2 (Fwd1 *f1, Fwd2 *f2) ;
#endif // __FWD2_H
// fwd2.c
#include "fwd1.h"
#include "fwd2.h"
void fwd2 (Fwd1 *f1, Fwd2 *f2) { return; }
// fwdMain.c
#include "fwd1.h"
#include "fwd2.h"
int main (int argc, char** argv, char** env)
{
Fwd1 *f1 = (Fwd1*)0;
Fwd2 *f2 = (Fwd2*)0;
fwd1(f1, f2);
fwd2(f1, f2);
return 0;
}
我正在使用命令编译:{{1}}
我已经尝试了几个想法来解决编译错误,但只是设法用其他错误替换错误...如何解决循环依赖问题,对我的代码进行最少的更改? ...理想情况下,作为编码风格的问题,我想避免在我的代码中加上“struct”这个词。
答案 0 :(得分:3)
这里的问题是当你做循环类型时,那么在第一次编译器运行时,gcc将没有完整的类型定义(这就是你得到未定义结构和东西的错误的原因),所以在适当的地方它有必要将'struct'放在专有名词之前。所以你的声明应该是这样的:
fwd1.h:
//fwd1.h
#ifndef __FWD1_H
#define __FWD1_H
#include "fwd2.h"
typedef struct Fwd1{
struct Fwd2 *f;
}Fwd1;
void fwd1 (Fwd1 *f1, struct Fwd2 *f2) ;
#endif // __FWD1_H
fwd2.h:
// fwd2.h
#ifndef __FWD2_H
#define __FWD2_H
#include "fwd1.h"
typedef struct Fwd2{
struct Fwd1 *f;
}Fwd2;
void fwd2 (struct Fwd1 *f1, Fwd2 *f2) ;
#endif // __FWD2_H
对.c上的函数定义执行等效更改。它应该像魅力一样。
P.S:.h文件的目的是声明你的.c所需的所有标题,即:函数定义,包含等。所以除了相应的.h。
之外,不需要重复.c上的任何包含这意味着你的fwd1.c应该只包含fwd1.h,然后所有其他包含应该放在fwd1.h上。
答案 1 :(得分:0)
我没有设法对此进行测试,但我认为以下变体可能会起作用。
// fwd1.h
#ifndef __FWD1_H
#define __FWD1_H
struct Fwd2; // use forward declaration of Fwd2 structure
typedef
struct Fwd1 {
Fwd2 *f;
}
Fwd1;
void fwd1 (Fwd1 *f1, Fwd2 *f2) ;
#endif // __FWD1_H
// fwd1.c is without changes
// fwd2.h
#ifndef __FWD2_H
#define __FWD2_H
struct Fwd1; // the same trick
typedef
struct Fwd2 {
Fwd1 *f;
}
Fwd2;
void fwd2 (Fwd1 *f1, Fwd2 *f2) ;
#endif // __FWD2_H
// fwd2.c is without changes
// fwdMain.c is without changes
答案 2 :(得分:0)
只需添加到fwd1.h顶部附近:
typedef struct Fwd2 Fwd2;
现在您可以使用Fwd2
作为不完整类型,例如声明Fwd2*
指针。同样,在fwd2.h中你会想要:
typedef struct Fwd1 Fwd1;
fwd1.h和fwd2.h甚至不需要彼此#include
。
答案 3 :(得分:0)
为了提供完整的循环依赖的typedef结构示例:
$ cat a.h
#ifndef __A_H__
#define __A_H__
typedef struct b_t b_t;
typedef struct a_t {
b_t * b;
} a_t;
#endif //__A_H__
$ cat b.h
#ifndef __B_H__
#define __B_H__
typedef struct a_t a_t;
typedef struct b_t {
struct a_t * a;
} b_t;
#endif //__B_H__
$ cat main.c
#include "a.h"
#include "b.h"
#include <stdio.h>
int main(int argc, char * argv[]) {
a_t a;
b_t b;
a.b = NULL;
b.a = NULL;
printf("Done.\n");
return 0;
}
$ cat Makefile
all: main.c a.h b.h
gcc main.c -o main
clean:
rm main
$ make
gcc main.c -o main
$ ./a.out
Done.
$