extern C возвращает объект класса

Я хочу иметь плагин с более простым именем для разрешения в другом коде C++.

class B {
};

extern "C" B foo(); // to avoid name mangling in order to be loaded by dlsym

А в другой части программы (которая также находится на C++ и имеет то же определение класса B с плагином):

B (*func)();
func = dlsym("/path/to/so", "foo");
B m = func();

Будет ли такой код вызывать какие-либо проблемы, т.е. разрешено ли (по стандарту) использовать класс C++ в качестве параметра или возвращаемого типа в extern "C" функционировать? Кажется, это работает на моем GCC, но как насчет других?

3 ответа

Решение

Это должно работать, с несколькими условиями:

  • Если вы намереваетесь изменить определение класса B на что-то другое, это не сработает. Единственное, что вы можете изменить, это определение foo().
  • И плагин, и программа загрузки должны согласовать интерфейс класса B на двоичном уровне. Переключение компиляторов (включая версию и некоторые флаги) может изменить этот интерфейс.
  • Вы, очевидно, должны привести значение возврата dlsym() в C++.
  • Использование классов на С невозможно.

Объявление foo() как extern "C" конечно, позволит вам загрузить его через dlsym() с использованием фактического, не исправленного имени функции, но в противном случае это не повлияет на то, как вы используете эту функцию после ее загрузки.

Обычные правила все еще применяются. Если вы нарушите бинарную совместимость foo() или класса B, вам нужно будет перекомпилировать плагин так же, как вам пришлось бы перекомпилировать его, если бы это была обычная динамическая библиотека, не загруженная во время выполнения.

Это будет работать до тех пор, пока вы придерживаетесь C++ и только C++. По понятным причинам вы не сможете скомпилировать объявление своей функции в модуле перевода Си. (Т.е. вы никогда не сможете правильно объяснить компилятору C, что B является.)

Итак, единственная проблема, которую я вижу здесь, это значение тега [C] в вашем вопросе. Вам также нужна какая-то перекрестная совместимость с C?

Другие вопросы по тегам