2010-09-13 48 views
0

我使用Visual Studio 2008 Express版本編譯的頭文件下面的代碼:爲什麼函數聲明返回bool不在我的C++項目中編譯?

bool is_active(widget *w); 

widget較早的定義,

typedef void widget; 

的編譯器錯誤抱怨:

>c:\projects\engine\engine\engine.h(451) : error C2061: syntax error : identifier 'is_active' 
1>c:\projects\engine\engine\engine.h(451) : error C2059: syntax error : ';' 
1>c:\projects\engine\engine\engine.h(451) : error C2059: syntax error : 'type' 

對於返回bool的所有其他函數,我得到類似的錯誤。

注意:下面編譯好了:

void widget_activate_msg(widget *g, message *msg); 

爲什麼會出現編譯器錯誤?

有些人要求我張貼代碼 - 這就是:

Line 449: widget * widget_new_from_resource(int resource_id); 
Line 450: void  widget_delete_one(widget *w); 
Line 451: bool  is_active(widget *w); 

編輯 - 這是現在固定:

@BatchyX評論下面我是否是用C或C++。我不知道的是Visual C++ 2008將編譯任何文件默認(但你可以覆蓋此設置),擴展名爲.c,C爲.cpp。 (編譯包含「Engine.h」的.c文件時導致錯誤)。

+0

你已經完成了'#include「stdafx.h」'在文件的開頭嗎?如果沒有,那麼你應該添加它,因爲它是一個Win32應用程序。 – Naveen 2010-09-13 09:52:34

+2

請顯示'engine.h'的441-451行。 – kennytm 2010-09-13 09:52:51

回答

4

很可能,此行上面的內容有語法錯誤。在類聲明後,你忘記了} s還是;

還要確保您使用的是C++而不是C. C沒有bool類型。如果你使用C,那麼用int代替。

+0

甚至爲bool製作一些typedef +枚舉(IIRC VC++不支持stdbool.h)。 – 2010-09-13 10:01:11

+0

我正在使用C++。順便說一下,Visual C++ 2008將如何知道我是否在使用C或C++ - 編譯器開關? – BeeBand 2010-09-13 10:02:03

+0

我發現Visual C++ 2008將編譯任何擴展名爲.c的文件作爲C以及任何擴展名爲.cpp的文件作爲C++。你最接近答案 - 因爲當我想編譯C++時,我清楚地編譯了C語言。 – BeeBand 2010-09-13 10:14:34

2

我猜這是不可能的typedef void。爲什麼不使用typdef void* WidgetPtr;然後bool is_active(WidgetPtr w);
編輯:已經做了一些測試,很明顯void可以被typedef'd,它可以是用戶代碼中所示的函數簽名的一部分。所以唯一的另一個解決方案是,聲明typedef void Widget的任何頭文件不包含在聲明/定義函數的文件中,或者您有#def guard語句衝突。

+0

絕對可以使用typedef void。 – BeeBand 2010-09-13 10:00:20

+0

@BeeBand ...是的,在測試後發現我自己:) – 2010-09-13 10:03:03

+0

'typedef void widget'與導致編譯錯誤的函數聲明(即「Engine。h「) – BeeBand 2010-09-13 10:03:46

相關問題