Упаковка ссылок C ++ в C API - PullRequest
4 голосов
/ 24 января 2012

У меня есть файл заголовка для того, что должно быть комбинированным C ++ и C API. Часть C обернута в extern "C", но сами объявления очень похожи на C; например:

foo::Bar& Foo_Baz_GetBarOfQux(void *_self, const foo::Qux &qux);

Есть ли способ на самом деле использовать его из простого C? Я, очевидно, не могу использовать этот заголовок, но, возможно, я могу как-то его переопределить:

/* type? */ Foo_Baz_GetBarOfQux(void*, const /* type? */);

Что меня озадачивает, так это то, как объявлять типы этих ссылок (если это возможно).

P.S. Я знаю, что могу написать свою собственную оболочку C поверх этого: я объявляю классы непрозрачными структурами:

typedef struct foo_bar foo_bar_t;
typedef struct foo_baz foo_baz_t;
typedef struct foo_qux foo_qux_t;

и затем напишите C-подобную функцию, которая обернет вышеупомянутую функцию:

extern "C" 
foo_bar_t*
foo_baz_get_bar_of_qux(
    foo_baz_t* baz,
    foo_qux_t* qux)
{
    return (foo_bar_t*) Foo_Baz_GetBarOfQux(baz, *(foo::Qux*)qux);
}

Но мне интересно, могу ли я использовать оригинал Foo_Baz_GetBarOfQux() напрямую.

Ответы [ 2 ]

7 голосов
/ 24 января 2012

Нет, вы не можете использовать Foo_Baz_GetBar() напрямую, вызовы функции-члена в c++ подразумевают неявную передачу указателя this, которого нет в вашем коде c.

2 голосов
/ 24 января 2012

В общем, было бы лучше использовать непрозрачные структуры.

В интерфейсе кода "C" никогда не пытайтесь извлекать данные в непрозрачной структуре, просто покорно передавайте указатели.

В части "C ++" вы должны определить структуру и фактически заполнить их соответствующим образом (я бы избежал слепого приведения типов).

Конечно, часть "C ++" не должна отображаться в заголовке "C", чтобы не запутать компилятор C.

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