将C库移植到C ++

时间:2013-12-12 18:50:21

标签: c++ c c++11

我想知道这是将C库移植到C++的正确方法;在这个例子中,我写了一个带有函数的2行C头和管理指针的typedef

lib.h

#ifndef LIB_H
#define LIB_H

#include <math.h>

double foo(double a) { return (log(a)); }

typedef double (*PtoFoo)(double);

#endif // LIB_H

lib.hpp

#ifndef LIB_HPP
#define LIB_HPP

namespace lib {
extern "C" {
#include "lib.h"
}
}

#endif // LIB_HPP

并在C++11

进行一点测试
#include <iostream>
#include "lib.hpp"
#include <functional>

int main() {
  // call to the function
  std::cout << lib::foo(42354.343) << "\n";
  // trying the pointer to function type
  lib::PtoFoo ptr = lib::foo;
  std::function<double(double)> f(ptr);
  std::cout << f(342.4) << "\n";
  return (0);
}

现在我的注意力集中在指针,函数指针和函数上,但一般来说我想知道这是否是将标准C代码移植到C++并使用新的正确方法带有名称空间的c ++接口,没有可能的逆火。

2 个答案:

答案 0 :(得分:3)

是的,这是正确的方法。

或者,您可以使用__cplusplus预处理程序令牌在同一个头文件中定义C ++接口:

#ifdef __cplusplus
namespace lib {
extern "C" {
#endif

typedef ...

#ifdef __cplusplus
}
}
#endif

这种方法的优点是只需要一个头文件。

答案 1 :(得分:1)

正如我评论的那样,C ++旨在与C兼容,因此只需使用适当的extern "C" {} /* end extern "C"*/;包装C库头就足够了。

但是,您可能希望为库设计一个C ++友好的接口。这需要一些想法和一些代码(大部分代码都在C ++特定的头文件中)。例如,您可能希望使用C ++对象,重载,运算符和模板工具提供接口。

我无法提供更多帮助,但请查看以下示例:libonion及其C++ bindingsGTKmm这是与GTK(和伴随库)的大型C ++绑定例如Glib ...),C++ class interfacegmplib,甚至是最新的C++11标准thread library(即std::thread等等。 ..)可以被视为pthreads ....

的巧妙C ++包装

我相信每个库都可以拥有自己的C ++包装......如何设计由您决定...(很大程度上取决于包装的库,您的可用时间以及您对C ++的流畅性......)