【问题标题】:Compiler error when using Info-ZIP 3.0 source code使用 Info-ZIP 3.0 源代码时出现编译器错误
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我想知道是否存在不需要更改 Info-ZIP 代码的解决方案。

    如果windows.h 有一个包含保护,一个解决方案可能是先包含它:

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

    这样,struct 定义在 #define CR 妨碍之前被解析。当然,这仅适用于稍后在编译单元中不使用structCR 元素。

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      相关资源
      最近更新 更多