c++ - 在不编辑标题的情况下取消命名空间类的全局化

标签 c++ namespaces protocol-buffers

Google 为他们从 Ad Exchange 网络发送的消息提供了一个 protobuf 模板。 (免费提供 here)我使用 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 文件是,我们都必须这样做改变了),我想不出一种通过使用命名空间来做到这一点的方法。

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

// 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"
}

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

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

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

最佳答案

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

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

关于c++ - 在不编辑标题的情况下取消命名空间类的全局化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18263123/

相关文章:

c++ - C++的for循环初始化错误的迭代器

c++ - 学习 C/C++ 多线程的好书/培训 Material

c# - 如何在 SOAP header 中声明命名空间前缀

ruby - 用 '-' 或 '_' 命名 ruby gem 有什么注释或规则吗?

c# - Protobuf-Net 错误消息 : No Serializer defined for type: System. 类型

c++ - Windows Shell API 是否适用于长 Unicode 路径?

c++ - 编译 DirectX11 着色器文件

Javascript - 命名空间与闭包之间的区别?

c++ - 将 Google 的协议(protocol) Buffer 添加到 Qt ;禁用编译器警告

python - “google.protobuf.descriptor”没有属性 '_internal_create_key'