У нас есть большое старое приложение на C++ с большим количеством унаследованного кода и несколькими внешними библиотеками, написанными на C. Эти библиотеки очень редко обновляются -, только если мы обнаруживаем ошибку, а поставщик предоставляет исправление. Это произошло на прошлой неделе с одной библиотекой, и после интеграции новой версии мы обнаружили, что если мы не изменим библиотеку локально (, что мы, очевидно, сделали с последней версией ), наша сборка прерывается с этим сообщением об ошибке :
non-local function ‘static E* MyCls::myFct(<anonymous struct>*)’ uses anonymous type
. ] Это связано с тем, что библиотека объявляет несколько типов дескрипторов, подобных этому:
#define _Opaque struct {unsigned long x;} *
typedef _Opaque Handle;
typedef _Opaque Request;
которые мы используем на нашей стороне в сигнатурах функций некоторых классов:
class MyCls {
public:
static void* myFct(Handle handle);
...
}
Это приводит к указанной выше ошибке, потому что компилятор не может создать искаженное имя -для функции (s ), поскольку _непрозрачная структура не имеет имени.
Наш текущий обходной путь для этого состоит в том, чтобы исправить файл заголовка библиотеки, явно указав имя структуры :
//#define _Opaque struct {unsigned long x;} * //Replaced by typedef below!
typedef struct __Opaque {unsigned long x;} * _Opaque;
. Это явно плохо, потому что мы не хотим трогать библиотеку, если это возможно. Еще один худший вариант — преобразовать типы в void*
во всех сигнатурах функций и привести их обратно к соответствующим типам. И есть худший вариант — переписать каждую затронутую функцию на чистом C...
Итак, мой вопрос: :Есть ли лучший вариант, чем исправление библиотеки? Есть ли простое решение, которое я пропускаю? Что было бы лучшим способом решить эту проблему?