我想知道这是将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 ++接口,没有可能的逆火。
答案 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++ bindings,GTKmm这是与GTK(和伴随库)的大型C ++绑定例如Glib
...),C++ class interface到gmplib,甚至是最新的C++11标准thread library(即std::thread等等。 ..)可以被视为pthreads ....
我相信每个库都可以拥有自己的C ++包装......如何设计由您决定...(很大程度上取决于包装的库,您的可用时间以及您对C ++的流畅性......)