[英]Porting a C library to C++
我想知道這是否是將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 ++接口的正確方法,而不會產生適得其反的結果。
是的,這是正確的方法。
另外,您可以使用__cplusplus
預處理程序令牌在同一頭文件中定義C ++接口:
#ifdef __cplusplus
namespace lib {
extern "C" {
#endif
typedef ...
#ifdef __cplusplus
}
}
#endif
這種方法的優點是只需要一個頭文件。
正如我所評論的,C ++旨在與C兼容,因此只需將C庫頭文件包裝在適當的extern "C" {
和} /* end extern "C"*/;
足夠。
但是,您可能需要設計一個C ++友好的庫接口。 這需要一些思想和一些代碼(大部分都在C ++特定的頭文件中)。 例如,您可能想使用C ++對象,重載,運算符和模板工具來提供接口。
我無能為力 ,但可以在以下地方找到示例: libonion及其C ++綁定 , GTKmm ,它是與GTK的大型C ++綁定(以及諸如Glib
配套庫...), gmplib的C ++類接口 ,甚至是最新的C ++ 11標准線程庫 (即std :: thread等,等等),可以將其視為pthread的巧妙C ++包裝...。
我相信每個庫都可以有自己的C ++包裝...如何設計取決於您...(在很大程度上取決於包裝的庫,您的可用時間以及您對C ++的流利程度...)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.