У меня есть файл заголовка для того, что должно быть объединенным C++ и C API. Часть C завернута в extern "C"
, но сами декларации очень сильно отличаются от C; например:Обтекание ссылок C++ в C API
foo::Bar& Foo_Baz_GetBarOfQux(void *_self, const foo::Qux &qux);
Есть ли способ на самом деле использовать его в форме plain 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()
.
AFAIK niether У вас есть оператор разрешающей способности '::' в C, и вы можете возвращать ссылки, такие как 'Bar &', поэтому вы не можете использовать функцию как есть в обычном C –
@ another.anon.coward Правильно, но, возможно, я могу переопределить Это? (Обновлен вопрос.) –
Я думаю, должно быть возможно, если вы определяете типы C (structs?) С тем же самым расположением памяти, что и foo :: Bar и foo :: Qux. – Alex