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, но как насчет других?

6

Решение

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

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

Другие решения

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

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

1

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

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

0
По вопросам рекламы [email protected]