2012-07-16 26 views
0

A.HC正向聲明(試過像C++,但沒有工作)

#ifndef A 
#define A 

#include "B.h" 

typedef struct { 
    B* b; 
} A; 
void InitA(A* a) { 
    a->b=malloc(sizeof(B)); 
} 

#endif 

B.h

#ifndef B 
#define B 

#include "A.h" 

typedef struct { 
    A* a; 
} B; 
void InitB(B* b) { 
    b->a=malloc(sizeof(A)); 
} 

#endif 

我試過這樣的,像C++和類型定義。 typedef使類型之間的衝突錯誤和先前的聲明在這裏等。

謝謝。

+2

首先你有重複的包括警衛。在'A.h'中你也定義了'B'。 – RedX 2012-07-16 13:01:12

+2

'#define B'在你的類型被稱爲'B'時不能正常工作... – 2012-07-16 13:01:23

+0

頂層文件不應該是'#ifndef A' .... – 2012-07-16 13:01:32

回答

1

這裏的修復它的一種方式:

啊:

#ifndef A_H_ 
#define A_H_ 

typedef struct A 
{ 
    struct B* b; 
} A; 

#include "b.h" 

void InitA(A* a) 
{ 
    a->b = malloc(sizeof(B)); 
} 

#endif 

BH:

#ifndef B_H_ 
#define B_H_ 

typedef struct B 
{ 
    struct A* a; 
} B; 

#include "a.h" 

void InitB(B* b) 
{ 
    b->a = malloc(sizeof(A)); 
} 

#endif 

爲主。 c:

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

int main(void) 
{ 
    A a; 
    B b; 
    InitA(&a); 
    InitB(&b); 
    return 0; 
} 

問題是,要使sizeof()正常工作,其參數必須是已知類型。在您的代碼AB尚未完全知道,當你做sizeof(A)sizeof(B)InitA()InitB()。重新排列類型定義,文件包含和函數定義的順序可以解決這個問題。

0

好吧,讓我們一步一步來。

讓我們看看會發生什麼,如果你想包含的文件之一,在這個例子:A.h

  • A.h將包括B.h
  • B.h將包括A.h,這將因爲頭的跳過守衛。
  • B.h使用A* a;其中A是未知類型,此時您將收到編譯錯誤。

你必須轉發聲明這樣的類型:struct A;(在B.h之前,在結構定義之前)。

類似的推理適用於其他文件(struct B;

+0

我嘗試了前向聲明,我使用原始的C,而不是C++。 – 2012-07-16 13:08:00

+0

我對此表示懷疑。發佈完整的代碼和編譯器錯誤消息。 – 2012-07-16 13:11:33

+0

這是很長的http://pastebin.com/V8e4ThnL(DecompileTestApplication_Program.h)http://pastebin.com/C3ezkLzG(MyAnotherProgram.h)在第一個文件中寫入的錯誤。 – 2012-07-16 13:18:57