Использовать тип, определенный в библиотеке C, в программе C ++ со схемой, подобной пространству имен - PullRequest
0 голосов
/ 02 июля 2018

Я написал библиотеку C, которая определяет некоторые функции и типы, такие как:

typedef struct {
  int i;
} A;
void func1(void);
int func2(A* a);

Теперь я хочу использовать эти функции и создавать переменные типа A в программе на C ++. К сожалению, в C нет пространств имен, но я все же хотел бы эмулировать некоторую похожую структуру, чтобы избежать конфликтов имен в программе C ++. Однако мне не нравится опция добавления каждой функции и структуры с префиксом:

typedef struct {
  int i;
} library_A;
void library_func1(void);
int library_func2(A* a);

Я нашел этот хороший способ эмулировать схему пространства имен путем определения структуры, которая имеет несколько указателей на функции:

/*interface.h*/
struct library {
    void (*func1)(void);
    void (*func2)(A*);
};

extern const struct library Library;
/* end interface.h */

/* interface.c */
#include "interface.h"

void func1(void)
{
   ...
}
void func2(A* a)
{
   ...
}

const struct library Library = {
    .func1 = func1,
    .func2 = func2,
};
/* end interface.c */

/* C++ program */
#include "interface.h"

int main(void)
{
    Library.method1();
    A a;
    a.i = 5;
    Library.method2(&a);
    return 0;
}
/* end C++ program */

Можно ли также включить определение типа A в Library или иным способом, чтобы тип Library.A определялся в программе C ++, и я могу написать программу C ++ как

#include "interface.h"

int main(void)
{
    Library.method1();
    Library.A a;
    a.i = 5;
    Library.method2(&a);
    return 0;
}

1 Ответ

0 голосов
/ 04 июля 2018

Насколько мне известно, это невозможно сделать.

Однако мне не нравится опция добавления каждой функции и структуры с префиксом

Это правильный способ справиться с этой ситуацией. Подумайте об этом так: пространства имен также работают как префиксы, разница в том, что вместо подчеркивания _ вы используете двойные двоеточия ::.

Ваш подход к использованию Library global удивителен с точки зрения пользователя. Как пользователь, мой первый вопрос будет:

Есть ли техническая причина, по которой я не должен напрямую использовать библиотечные функции?

Если нет никакой причины, кроме вас, разработчика, просто не любящего, как выглядит library_XYZ, тогда моя следующая мысль будет:

Бессмысленная странность. Разработчик библиотеки не относится к этому серьезно или неопытен.

И еще одна вещь, это будет дополнительная работа для вас, чтобы поддерживать помощника библиотеки struct всякий раз, когда вы добавляете, удаляете или переименовываете вещи из библиотеки. В конечном итоге это станет бременем для обновления этого глобального.

...