2010-09-13 93 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

相关问题