Работа с анонимными типами структур библиотеки C в C++

У нас есть большое старое приложение на 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...

Итак, мой вопрос: :Есть ли лучший вариант, чем исправление библиотеки? Есть ли простое решение, которое я пропускаю? Что было бы лучшим способом решить эту проблему?

6
задан l4mpi 13 August 2012 в 11:48
поделиться