2008/12/26

[C++] Multiple include

#ifndef A_HPP_
#define A_HPP_
#include "B.hpp"

class A
{
public:
//B* bpt;
A();
virtual ~A();
private:
B* bpt;
};
#endif /*A_HPP_*/
=========================================
#include "A.hpp"
#include "B.hpp"
A::A()
{
}

A::~A()
{
}
========================================
#ifndef B_HPP_
#define B_HPP_
#include "A.hpp"

class B
{
public:
//A* apt;
B();
virtual ~B();
private:
A* apt;
};
#endif /*B_HPP_*/
=======================================
#include "B.hpp"
#include "A.hpp"
B::B()
{
}

B::~B()
{
}


即使寫了,#ifnde,#define,#ifndef也無法解決Multiple Inclusions的問題?錯誤資訊如下:
error: ISO C++ forbids declaration of ‘A’ with no type

error: expected ‘;’ before ‘*’
真是非常的奇怪,不過只要使用pre-declare(forward declar)就可以了(如下)。有誰可以告訴我為什麼嗎?

#ifndef B_HPP_
#define B_HPP_
class A;
#include "A.hpp"
class B
{
public:
B();
virtual ~B();
private:
A* apt;
};
#endif /*B_HPP_*/


相關文章:千萬別把function definition & 變數definition寫入.h裡

4 則留言:

Falldog 提到...

我試了一下,看這錯誤訊息應該不是Multiple Inclusion的問題。

我試著將A.hpp改成下面這樣子,就可以了,B.hpp這樣的方法去改也行。
=============================
#ifndef A_HPP_
#define A_HPP_
#include "B.hpp"

class A
{
public:
//B* bpt;
A();
virtual ~A();
private:
class B* bpt;
};
#endif /*A_HPP_*/
=============================
至於為什麼這樣子...compiler為什麼可以接受class B這宣告,而看不懂B這宣告,我也不太清楚...可能要請高手來看吧XD

匿名 提到...

因為編譯器在處理 A.h,
在處理 #include B.h 時,發現有 class A 尚未宣告,
而 A.h 並未處理完畢,
所以編譯器尚未知道 class A 的存在。

so...
class A 等 class B 定義完
class B 等 class A ,
像是 OS 裡的 deadlock一般,

故得在 A.h 先行定義 class B
在 B.h 先行定義 class A 就可以解決這個問題了。

Unknown 提到...

這個是cyclic dependency(或cross dependency),打破循環引用即可。#include不過是文字代換指令,把#include那行代換成檔案內容,你可以自己試著代換看看應該就可以理解會什麼會有compile error了

Unknown 提到...

在 C 中若使用到外部 func 可用 extern 告之.
例:
uart.h
----------
#ifndef _UART_H
#define _UART_H
extern unsigned char TXState;
extern void InitUart(void);
#endif //_UART_H

uart.c
----------
unsigned char TXState;
void InitUart(void)
{
...;
}

main.c
----------
#include "uart.h"
main()
{
TXState = 123;
InitUart();
}

但不知 C++ 可否有此關鍵字

台灣好行:後慈湖、大溪老街半日遊

要搭台灣好行 慈湖線 (票價100)的朋友,可以在【中壢火車前站】出口,往左邊直走5分鐘到【桃園客運總站】搭乘。搭車到最後一站【慈湖】後可以看到導覽服務站。後慈湖算是管制區,需要先 上網申請 才可以進入,如果是搭台灣好行的話,可以直接在服務站登記候補。假日通常都是人滿為患,建議如...