【问题标题】:Using a library written in C with C++使用用 C 和 C++ 编写的库
【发布时间】:2019-01-06 22:53:53
【问题描述】:

我正在尝试包含用 C 编写的 mongoose Web 服务器,并用 C++ 编写其余代码。 编译时出现错误:在代码块中的 mongoose 头文件中重新声明 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 处遇到同样的错误

【问题讨论】:

标签: c++ c mongoose server


【解决方案1】:

C 和 C++ 是不同的语言,它们共享一个公共子集。您可以使用 C++ 编译器编译大多数 C 声明,方法是将它们放在指定 C 链接的部分中,如您所示,但这源于 C 声明的子语言几乎完全在 C 的共享子集中和C++。

然而,C++ 比 C 有更多的声明特性和更多的约束。特别是,它提供bool 作为内置类型这一事实施加了一个约束,即该标识符不能重新声明为 typedef 名称。另一方面,C 有一个标准的头文件,它准确地定义了这样的 typedef,而且人们自己滚动也并不少见。这样的 typedef 将被 C++ 编译器拒绝,尽管有 C 链接。

如果 C 项目的构建还没有考虑到为 C++ 程序提供使用,并且仅仅将头文件包含在 C 链接块中是不够的,那么您根本无法按原样使用该库的头文件。您的选择是修改它或提供替代方案。您甚至可能需要提供一些用 C 编写的包装函数作为与 C++ 程序的接口。详细信息取决于您尝试使用的库。

【讨论】:

    【解决方案2】:

    如果这是您唯一的问题,那么您可以在extern "C" 附近添加#define bool C_INT_BOOL,然后在} 附近添加#undef bool
    在你的 cpp 文件中,我会写:

    extern "C"{
    #define bool C_INT_BOOL
    #include "mongoose.h"
    #undef bool
    }
    

    这允许“C”接口查看 int 参数类型,但不应干扰您的 c++ 对 bool 的使用。

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

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 2012-05-19
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多