2013-12-12 4 views
2

Я хотел бы знать, является ли это правильным способом поместить библиотеку C в C++; для этого примера я написал 2-строчный C-заголовок с функцией и typedef, управляющий указателем.Портирование библиотеки C на C++

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); 
} 

прямо сейчас мое внимание сосредоточено на указатели, ФУНКЦИИ n указателей и функций, но в целом я хотел бы знать, является ли это правильным способом для порта стандартного кода C на C++ и с использованием нового интерфейса C++ с пространствами имен без возможных обратных обходов.

+0

C++ намеренно разработан как совместимый с C, поэтому вне 'extern 'C" {'(который можно было бы даже поставить перед' # include' ваших заголовков, если вы захотите ...) есть много портирования делать. Конечно, вы можете переписать (или обернуть) вещи, чтобы быть дружелюбным к C++, тогда это другая история .... –

+0

@BasileStarynkevitch исходная библиотека C это не проект, который я могу редактировать или манипулировать, это библиотека C что я могу использовать, но мне нужно использовать его в C++, поэтому мне нужно обернуть C++ вокруг C, не вмешиваясь в настоящую C-библиотеку или заголовки; Мне нужно, чтобы вы расширили свое представление об этом, потому что у меня нет конкретной идеи о том, о чем вы говорите. – user2485710

+0

Библиотека C полностью совместима с C++ 11.Или вы можете использовать '#ifdef __cplusplus', который определит интерфейс C++ – Joe

ответ

3

Да, это правильный способ сделать это.

В качестве альтернативы, вы можете использовать маркер __cplusplus препроцессора для определения интерфейса C++ в том же файле заголовка:

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

typedef ... 

#ifdef __cplusplus 
} 
} 
#endif 

Преимущество такого подхода заключается в том, что требуется только один файл заголовка.

+0

спасибо, но я не думаю, что могу использовать это, потому что оригинальная библиотека 'C' это не мой проект. Я предполагаю, что этот токен предназначен для компилятора 'C', который не понимает директивы' namespace' и 'extern' и ни для чего другого. – user2485710

+0

@ user2485710: (Ответ здесь, но это относится ко всем вашим комментариям). До сих пор вы были _assuming_, что есть проблема, и вы, конечно, не показали нам реальной проблемы. Я предлагаю вам закрыть этот вопрос, ** использовать библиотеку C **, и только ** если ** есть проблема с этим, задайте вопрос. И затем покажите нам ** точную ** проблему, которая у вас есть, включая сообщения об ошибках. – MSalters

1

Как я уже говорил, C++ предназначен для совместимости с C, поэтому достаточно просто обернуть ваши заголовки библиотеки C соответствующими extern "C" { и } /* end extern "C"*/;.

Однако вы можете захотеть создать дружественный к C++ интерфейс в своей библиотеке. Это требует некоторых мыслей и некоторого кода (большинство из них в файлах заголовков C++). Например, вы можете предоставить интерфейсы с использованием объектов C++, перегрузки, оператора и шаблона.

Я не могу больше, но найти примеры по адресу: libonion и ее C++ bindings, GTKmm который является большой C++ привязку к GTK (и сопутствующих библиотек, как Glib ...), то C++ class interface к gmplib, или даже новейший C++11 стандарт thread library (т.е. std::thread и т.д., и т.д ...), которые можно было бы рассматривать как умную C++ обертка из pthreads ....

Я считаю, что каждая библиотека может иметь свою собственную C++ обертки ... Как создать это зависит от вас ... (многое зависит от обернутой библиотеки, вашего доступного времени и свободного общения с C++ ...).

Смежные вопросы