Ошибка компилятора при использовании исходного кода Info-ZIP 3.0 - PullRequest
1 голос
/ 03 июля 2019

В нашей устаревшей кодовой базе C ++ мы используем исходный код Info-ZIP 3.0 (написанный на C), доступный с https://sourceforge.net/projects/infozip/files/Zip%203.x%20%28latest%29/3.0/, для создания ZIP-файлов.Переход на другую структуру для создания ZIP-файла в настоящее время не является возможным из-за нехватки времени.Чтобы использовать этот код, мы делаем что-то вроде

extern "C" {
  #include "api.h"
}
...
extern "C" int EXPENTRY ZpArchive(ZCL C, LPZPOPT Opts);

. Это хорошо работает с VS2015, но больше не компилируется при переключении на VS2019.Проблема в том, что Info-ZIP api.h включает в себя Info-ZIP zip.h, который имеет следующее определение:

  #define CR     13

позже, api.h также условно включает windows.h:

#if defined(WINDLL) || defined(API)
#include <windows.h>
...
#endif /* WINDLL? || API? */

, который в конечном итоге также включает winnt.h, который имеет следующий typedef:

typedef struct _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY {
    DWORD BeginAddress;
    union {
        DWORD UnwindData;
        struct {
            DWORD Flag : 2;
            DWORD FunctionLength : 11;
            DWORD RegF : 3;
            DWORD RegI : 4;
            DWORD H : 1;
            DWORD CR : 2;
            DWORD FrameSize : 9;
        } DUMMYSTRUCTNAME;
    } DUMMYUNIONNAME;
} IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY, * PIMAGE_ARM64_RUNTIME_FUNCTION_ENTRY;

Обратите внимание, что элемент CR во внутренней структуре из этой typedef конфликтует с ранее определенным макросом CR, иэто приводит к ошибке компилятора.

Каков был бы чистый способ решить эту проблему, желательно не слишком сильно меняя исходный код Info-ZIP (или вообще ничего)?

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Я наконец решил решить проблему, переименовав макрос CR в INFOZIP_CR.Оказалось, что я должен был сделать это только в четырех местах, поэтому влияние на исходный код Info-ZIP довольно минимально.Спасибо за все комментарии / предложения.

0 голосов
/ 04 июля 2019

Мне интересно, существует ли решение, для которого мне не нужно менять код Info-ZIP.

При условии, что у windows.h есть защита включения, можно сначала включить ее:

#include <windows.h>
extern "C"
{
  #include "api.h"
}

Таким образом, определение struct анализируется до того, как #define CR мешает. Конечно, это работает только в том случае, если элемент CR в struct не используется позднее в модуле компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...