在C ++中使用用C编写的库

时间:2018-07-30 16:14:27

标签: c++ c mongoose server

我试图包括用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,我仍然遇到相同的错误

2 个答案:

答案 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的使用。

但是我怀疑这将是您唯一的问题,在这种情况下,您可能很快就会意识到添加接口功能层是最安全的方法。