【发布时间】:2019-11-14 00:54:15
【问题描述】:
在我们遗留的 C++ 代码库中,我们使用来自 https://sourceforge.net/projects/infozip/files/Zip%203.x%20%28latest%29/3.0/ 的 Info-ZIP 3.0 源代码(用 C 编写)来创建 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 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;
请注意,此 typedef 的内部结构中的 CR 成员与
之前定义的 CR 宏,这会导致编译器错误。
什么是解决这个问题的干净方法,最好不要过多地更改 Info-ZIP 的源代码(甚至根本不更改)?
【问题讨论】:
-
你能左右移动
api.h的内容吗?将CR的定义移到winnt.h下包含?完全删除 CR 定义? -
请注意,我可以通过重命名
CR宏(例如INFOZIP_CR)来解决编译器错误,但由于我更喜欢尽可能减少对第三方代码的修改,所以我是想知道是否存在不需要更改 Info-ZIP 代码的解决方案。 -
这项工作是否可行:
#include "zip.h"、#undef CR、#include "api.h"? -
您可以控制源代码,因此您可以将所有出现的
CR替换为MYCR。影响很小。 -
@BartVandewoestyne 使用
-UCR -DINFOZIP_CR=16 -DCR=INFOZIP_CR编译
标签: c++ c compiler-errors zip