我试图包括用C编写的猫鼬Web服务器,并用C ++编写其余代码。 编译时出现错误:在代码块的猫鼬头文件中重新声明了C ++内置类型'bool'
#include <iostream>
#include "mongoose.h"
using namespace std;
int main()
{
cout << "Hello world!" << endl;
return 0;
}
我把猫鼬头放在了其中
#ifdef __cplusplus
extern "C"{
#endif
// header content
#ifdef __cplusplus
}
#endif
在#include winsock2.h,我仍然遇到相同的错误
答案 0 :(得分:2)
C和C ++是共享公共子集的不同语言。如图所示,您可以将大多数C 声明用C ++编译器编译,方法是将它们放置在指定C链接的部分中,但这是由于C声明的子语言几乎完全位于C和C的共享子集中。 C ++。
但是,C ++比C具有更多的声明功能和更多的约束。特别是,它提供bool
作为内置类型这一事实提出了一个约束,即不能将该标识符重新声明为typedef名称。另一方面,C具有标准的标头,该标头恰好定义了这种typedef,人们也经常使用自己的标头。尽管有C链接,但C ++编译器会拒绝此类typedef。
如果尚未构建C项目以供C ++程序使用,并且仅将头文件包含在C链接块中是不够的,那么您根本无法按原样使用该库的头文件。您的选择是修改它或提供替代方法。您甚至可能需要提供一些用C编写的包装函数,以用作与C ++程序的接口。详细信息取决于您要使用的库。
答案 1 :(得分:0)
如果这是您唯一的问题,则可以在#define bool C_INT_BOOL
附近添加extern "C"
,然后在#undef bool
附近添加}
在您的cpp文件中,我会写:
extern "C"{
#define bool C_INT_BOOL
#include "mongoose.h"
#undef bool
}
这允许“ C”界面查看int参数类型,但不应干扰c ++对bool的使用。
但是我怀疑这将是您唯一的问题,在这种情况下,您可能很快就会意识到添加接口功能层是最安全的方法。