处理protoc插件中的自定义选项

时间:2013-11-27 16:02:09

标签: c++ protocol-buffers

我正在尝试开发一个插件,以便自动生成特定于我的应用程序的代码。 虽然一个更简单的策略是让我的代码使用c ++插件生成的文件,但我试图从头开始编写插件。

正如我已添加到我的包中的文档中所述

import "google/protobuf/descriptor.proto";

extend google.protobuf.FieldOptions {
    optional int32 testext = 50000;
}

...

message replyT {
   enum ackT {
      ok = 0;
      failed = 1;
   }

   required ackT ack = 1 [ (testext) = 42 ];
}

现在的问题是如何访问“testext选项”?

我已经能够使用

转储 50000 42 (分机号码和分配的值)
class TestGenerator: public CodeGenerator {
    int i;
public:
    TestGenerator(const string& name) {};
    virtual ~TestGenerator() {};
    virtual bool Generate(const FileDescriptor* file,
                          const string& parameter,
                          GeneratorContext* context,
                          string* error) const
    {
         ........................
          std::cerr <<"\t\t"<<file->message_type(i)->field(j)->options().DebugString()<<std::endl;
      .................

假设(i和j是正确的)

但除此之外我还没有能够在探索文档后如何测试某个字段是否启用了扩展名testext(即使使用50000)和分配的值。

语言指南建议 但是GetExtension方法使用的类型只在* .pb.h中生成,所以我不能在我的生成器中使用它。

string value = MyMessage::descriptor()->options().GetExtension(my_option);

任何线索?

1 个答案:

答案 0 :(得分:1)

您必须为定义自定义选项的文件运行C ++生成器。之后,您可以使用已经找到的正常GetExtension()语法。