4

我正在尝试将 protobuf c++ 构建到 ios 中。但是它的实现包含一个 TYPE_BOOL 枚举变量,它与 ios 宏中的 TYPE_BOOL 冲突。并且编译失败。

如何解决这个问题?

4

1 回答 1

2

有一些合理(但很老套)的选项:

  1. #include在您使用任何 iOS 标头TYPE_BOOL 之前使用的任何 protobuf 标头。#include例子:

    #include <google/protobuf/descriptor.h>
    #include <ConditionalMacros.h>
    

    TYPE_BOOL这使您可以在自己的代码中使用 iOS ,但不能使用 protobuf 的TYPE_BOOL.

  2. #includeiOS 标头,然后#undef TYPE_BOOL#includeprotobuf 标头。例子:

    #include <ConditionalMacros.h>
    #undef TYPE_BOOL
    #include <google/protobuf/descriptor.h>
    

    TYPE_BOOL这使您可以在自己的代码中使用 protobuf ,而不是 iOS 的TYPE_BOOL.

  3. 如果您需要两个定义,这可能有效(未经测试):

    #include <google/protobuf/descriptor.h>
    
    // Make a copy of TYPE_BOOL before it is hidden by a macro.
    const google::protobuf::FieldDescriptor::Type PROTOBUF_TYPE_BOOL =
        google::protobuf::FieldDescriptor::TYPE_BOOL;
    
    #include <ConditionalMacros.h>
    

    现在PROTOBUF_TYPE_BOOL在需要 Protobuf 定义时使用。

请注意,google/protobuf/descriptor.pb.h它还定义了一个TYPE_BOOL. 可以用同样的方法解决,但是大多数人不使用那个标题,所以我把它排除在例子之外。

于 2013-08-19T18:51:47.753 回答