使用Info ZIP 3.0源代码时出现编译器错误 在我们的传统C++代码库中,我们使用的是从创建的信息zip 3源代码(用C编写) 压缩文件。目前正在切换到另一个框架来创建ZIP文件 由于时间限制,这不是一个选项。要使用此代码,我们需要执行以下操作 extern "C" { #include "api.h" } ... extern "C" int EXPENTRY ZpArchive(ZCL C, LPZPOPT Opts);

使用Info ZIP 3.0源代码时出现编译器错误 在我们的传统C++代码库中,我们使用的是从创建的信息zip 3源代码(用C编写) 压缩文件。目前正在切换到另一个框架来创建ZIP文件 由于时间限制,这不是一个选项。要使用此代码,我们需要执行以下操作 extern "C" { #include "api.h" } ... extern "C" int EXPENTRY ZpArchive(ZCL C, LPZPOPT Opts);,c++,c,compiler-errors,zip,C++,C,Compiler Errors,Zip,这在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? */ 请注意,此typedef的内部结构中的CR成员与 先前定义的C

这在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? */
请注意,此typedef的内部结构中的
CR
成员与 先前定义的CR宏,这将导致编译器错误


有什么干净的方法可以解决这个问题,最好不要对Info-ZIP的源代码做太多的更改(甚至什么都不更改)?

我最终决定将CR宏重命名为INFOZIP\u CR来解决这个问题。事实证明,我只需要在四个地方这样做,所以对Info-ZIP源代码的影响非常小。感谢所有的评论/建议

我想知道是否有一个解决方案,我不需要改变信息邮政编码

如果
windows.h
有一个include-guard,解决方案可以是首先包括它:

#include <windows.h>
extern "C"
{
  #include "api.h"
}
#包括
外部“C”
{
#包括“api.h”
}

这样,在
#define CR
阻塞之前,将解析
结构定义。当然,这只有在编译单元的后面没有使用
struct
CR
元素的情况下才起作用。

您能将
api.h
的内容四处移动吗?将
CR
的定义移到
winnt.h
include下面?完全删除CR定义?请注意,我可以通过重命名
CR
宏(例如
INFOZIP\u CR
)来解决编译器错误,但由于我更喜欢尽可能减少对第三方代码的修改,我想知道是否存在一种解决方案,我不需要更改Info ZIP的代码。这是否有效:
#包括“ZIP.h”
#undef CR
#包括“api.h”
?您可以控制源代码,因此您可以用say
MYCR
替换所有出现的
CR
。影响很小。@bartwandewestyne使用
-UCR-DINFOZIP\u CR=16-DCR=INFOZIP\u CR编译
#include <windows.h>
extern "C"
{
  #include "api.h"
}