使用Info ZIP 3.0源代码时出现编译器错误 在我们的传统C++代码库中,我们使用的是从创建的信息zip 3源代码(用C编写) 压缩文件。目前正在切换到另一个框架来创建ZIP文件 由于时间限制,这不是一个选项。要使用此代码,我们需要执行以下操作 extern "C" { #include "api.h" } ... extern "C" int EXPENTRY ZpArchive(ZCL C, LPZPOPT Opts);
这在VS2015中运行良好,但在切换到时不再编译 VS2019。问题在于,Info-ZIP的使用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
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”
?您可以控制源代码,因此您可以用sayMYCR
替换所有出现的CR
。影响很小。@bartwandewestyne使用-UCR-DINFOZIP\u CR=16-DCR=INFOZIP\u CR编译
#include <windows.h>
extern "C"
{
#include "api.h"
}