Boost.DateTime от C? - PullRequest
       12

Boost.DateTime от C?

0 голосов
/ 08 июня 2018

Можно ли использовать библиотеку Boost.DateTime из C, и если да, есть ли какие-либо примеры (предпочтительно охватывающие процесс сборки с использованием инструментов типа gcc)?Я искал документацию Boost и Интернет в целом, и это кажется теоретически возможным, но не нашел однозначного ответа, так или иначе.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

C и C ++ очень совместимы;вызов кода C из C ++ тривиален;однако вызов кода C ++ из C более ограничен, поскольку интерфейс должен иметь связь C и содержать только типы, доступные в C, и не может использовать специфические функции C ++, такие как аргументы по умолчанию или перегрузка функций, например.

Использование кода C ++ вC требует, чтобы у интерфейса была extern "C" спецификация связи, которая сама по себе недопустима C, поэтому спецификация в любом заголовочном файле должна быть условной, например:

// interop.h
#if !defined INTEROP_H
#define INTEROP_H

#if defined __cplusplus
extern "C"
{
#endif

// C interface here
void somefunction() ;

#if defined __cplusplus
}
#endif

#endif // INTEROP_H

Тогда реализация самого интерфейса будетКод C ++:

// interop.cpp
#include "interop.h"

void somefunction()
{
    // C++ code here callable from C through somefunction()
}

Но интерфейс вызывается из кода C:

// notcpp.c
#include "interop.h"
int main()
{
    somefunction() ;
}

Этот подход хорош, когда интерфейс прост, например, если вы используете Boost Date /Библиотека времени для какой-то очень специфической процедуры, результаты которой могут быть представлены в C, тогда это может быть целесообразным, если реализация эквивалентной функциональности только в C будет непомерной.Но создание оболочек C для целых классов C ++ отнимает много времени, подвержено ошибкам, негибко и, в конечном счете, бессмысленно - в общем случае проще будет скомпилировать ваш C-код как C ++, тогда барьер взаимодействия исчезнет, ​​поскольку вы сможете затем ввести специфический для C ++ код непосредственно в существующую кодовую базу.(хотя после этого он никогда не будет скомпилирован как C).C ++ является мультипарадигмой и включает библиотеку C в свою собственную библиотеку C ++, а большинство сторонних заголовков и библиотек OS C уже включают в себя оболочку условных связей C C ++, поэтому вам не нужно переписывать весь код в стиле ООП, чтобыиспользуйте C ++, если вы хотите воспользоваться преимуществами большей библиотечной экосистемы.

0 голосов
/ 08 июня 2018

Нет.Boost - это библиотека C ++, и Boost.DateTime не является исключением.Если вы посмотрите на любой из заголовков DateTime, вы увидите функции C ++ везде, от классов до шаблонов, пространств имен и многого другого - ни одна из них не поддерживается в C.

Однако вы можете создать библиотеку-оболочкув C ++, который предоставляет необходимые вам функции в виде чистых функций C, а затем вызывает их из C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...