Я хотел бы знать, является ли это правильным способом поместить библиотеку 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++ с пространствами имен без возможных обратных обходов.
C++ намеренно разработан как совместимый с C, поэтому вне 'extern 'C" {'(который можно было бы даже поставить перед' # include' ваших заголовков, если вы захотите ...) есть много портирования делать. Конечно, вы можете переписать (или обернуть) вещи, чтобы быть дружелюбным к C++, тогда это другая история .... –
@BasileStarynkevitch исходная библиотека C это не проект, который я могу редактировать или манипулировать, это библиотека C что я могу использовать, но мне нужно использовать его в C++, поэтому мне нужно обернуть C++ вокруг C, не вмешиваясь в настоящую C-библиотеку или заголовки; Мне нужно, чтобы вы расширили свое представление об этом, потому что у меня нет конкретной идеи о том, о чем вы говорите. – user2485710
Библиотека C полностью совместима с C++ 11.Или вы можете использовать '#ifdef __cplusplus', который определит интерфейс C++ – Joe