12

所以我对我继承的一些代码有疑问。此代码在纯 C 环境中构建良好,但现在我需要使用 C++ 来调用此代码。标题problem.h包含:

#ifndef _BOOL
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif

struct astruct
{
  bool myvar;
  /* and a bunch more */
}

当我将它编译为 C++ 代码时,我得到error C2632: 'char' followed by 'bool' is illegal

如果我将#include "problem.h"in包装起来,我会得到同样的错误(我不明白,因为编译为 C 时extern "C" { ... }应该没有关键字?)bool

我尝试从#ifndef _BOOLto删除块#endif,并编译为 C++,但出现错误:

error C2061: C requires that a struct or union has at least one member
error C2061: syntax error: identifier 'bool'

我只是不明白 C++ 编译器如何抱怨重新定义bool,但是当我删除重新定义并尝试仅用于bool定义变量时,它什么也找不到。

任何帮助是极大的赞赏。

4

4 回答 4

20

因为bool是 C++(但不是 C)中的基本类型,不能重新定义。

你可以用

#ifndef __cplusplus
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif
于 2012-05-17T12:56:05.153 回答
7

您可以使用 C99 的bool

#ifndef __cplusplus
#include <stdbool.h>
#endif

bool myBoolean; // bool is declared as either C99's _Bool, or C++'s bool data type.

为什么要使用这个?

为了与其他 C99 代码兼容。_Bool在 C99 代码中常用,非常有用。它还使您能够拥有布尔数据类型,而无需 typedef 很多东西,因为在幕后,_Bool是编译器定义的数据类型。

于 2012-05-17T12:56:53.143 回答
1

您应该使用__cplusplus宏:

#ifndef __cplusplus
#ifndef _BOOL
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif
#endif 

查看C++ 常见问题解答的此链接以获取更多详细信息。

于 2012-05-17T13:01:10.857 回答
-5

我在VS中也遇到了这个“'char'后跟'bool'是非法的”问题。对我来说,问题是我没有用分号结束我的类声明——我没想到这是问题,因为这是在头文件中,而问题出现在 cpp 文件中!例如:

class myClass
{

}; // <-- put the semi colon !!
于 2014-10-09T07:46:58.620 回答