簡體   English   中英

將C庫移植到C ++

[英]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配套庫...), gmplibC ++類接口 ,甚至是最新的C ++ 11標准線程庫 (即std :: thread等,等等),可以將其視為pthread的巧妙C ++包裝...。

我相信每個庫都可以有自己的C ++包裝...如何設計取決於您...(在很大程度上取決於包裝的庫,您的可用時間以及您對C ++的流利程度...)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM