0

Google 为他们从 Ad Exchange 网络发送的消息提供了一个 protobuf 模板。(可在此处免费获得)我protoc用来将此模板转换为 C++ 代码(自动生成)。我有一个问题,其中一个类的名称与我定义的名称冲突,例如

#include "realtime-bidding.pb.h"

// g++ complains that BidRequest is ambiguous.
void BidRequest::FromGoogle(const std::string& protobuf)
{
    // This what I want to write:
    // Google::BidRequest r;
    // r.ParseFromString(protobuf);
    if (r.has_field())
    {
        this->field = r.field();
    }
}

如果不编辑自动生成的文件protoc(不好,因为每次.proto更改文件时我们都必须这样做),我无法做到这一点,而且我无法通过使用namespaces.

真正的问题是谷歌坚持认为某些类在全局命名空间中,例如

// from realtime-bidding.pb.h
class Bidrequest_Mobile : public ::google::protobuf::Message {
    inline ::BidRequest_Mobile_DeviceOsVersion* mutable_os_version();`.
           ^^
}

所以我不能做类似的事情

namespace Google {
#include "realtime-bidding.pb.h"
}

因为它会阻止自动生成的代码编译。

为我的代码命名空间意味着对一个非常非常大的代码库进行太多更改,尽管它可能是正确的解决方案。然而,我在我所在的地方。

有没有什么技巧可以在不编辑自动生成的文件的情况下让这一切正常工作?将某些类放入全局命名空间是否有原因?

4

1 回答 1

1

您可以package在 .proto 文件中使用。

https://developers.google.com/protocol-buffers/docs/proto#packages

于 2013-08-15T23:19:10.450 回答