首页 > 解决方案 > 如何在协议缓冲区中提及枚举 (c++) 的底层数据类型?

问题描述

我想声明一个枚举,但我希望它的大小明确为“int8_t”。根据 protbuf docs[1],在 c++ 中生成的枚举是标准的 c++ 枚举,没有明确提及底层类型。

即这样的声明:

enum Foo {
  VALUE_A = 0;
  VALUE_B = 5;
  VALUE_C = 1234;
}

会产生这样的东西:

enum Foo {
      VALUE_A = 0;
      VALUE_B = 5;
      VALUE_C = 1234;
      Foo_INT_MIN_SENTINEL_DO_NOT_USE_ = ::google::protobuf::kint32min,
      Foo_INT_MIN_SENTINEL_DO_NOT_USE_ = ::google::protobuf::kint32max
    }

无论如何我可以强制protobuf生成定义中明确提到的类型的枚举吗?像这样的东西:

enum Foo : int8_t {
      VALUE_A = 0;
      VALUE_B = 5;
      VALUE_C = 1234;
      Foo_INT_MIN_SENTINEL_DO_NOT_USE_ = ::google::protobuf::kint32min,
      Foo_INT_MIN_SENTINEL_DO_NOT_USE_ = ::google::protobuf::kint32max
    }

为什么我需要这个?

我想转发声明我的原始枚举,枚举的转发声明需要你:

  1. 提及数据类型(以便编译器可以假定对象使用的大小)

  2. 枚举的声明必须提到与定义完全相同的类型 [2]

任何帮助将非常感激。

[1] https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#enum

[2] https://stackoverflow.com/a/42768812/3069919

标签: c++enumsprotocol-buffers

解决方案


推荐阅读