В нашей устаревшей кодовой базе 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 (или вообще ничего)?