给thrift的C++添加注释功能

本文介绍了如何改造Thrift的C++编译器,使其在生成代码时保留注释。通过修改`t_cpp_generator.cc`文件中处理doctext的部分,包括typedef、function、struct等不同字段的注释处理,最终编译生成新的thrift.exe用于生成带有注释的C++代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、thrift注释功能

thrift是有给生成的代码添加注释功能的,但并不支持C++。格式如下:

/**这里写注释*/
/**工具类型,分为定位器和普通*/
enum ToolType
{
    /**检查工具*/
    Check = 0;      
    /**定位器*/
    Fixture = 1;    
    /**通讯工具*/
    IORegex = 2;    
}

或者这样给函数增加注释

/**客户端服务接口*/
service ClientService
{
    /**设置执行结果*/
    bool SetResult(
    /**图片*/
    1: Base.image img,
    /**task列表*/
    2: list<ToolInterface.Task> tasks
    )
}


注释只对它的下一行生效,例如这样就不行

/**错误的注释格式*/
/**工具类型,分为定位器和普通*/
enum ToolType
{
    Check = 0;      /**检查工具*/
    Fixture = 1;    /**定位器*/
    IORegex = 2;    /**通讯工具*/
}

二、改造thrift,使生成代码时把注释也生成进去。

改造文件”compiler\cpp\src\thrift\generate\t_cpp_generator.cc”,新增对doctext项的处理。

  • 501行的generate_typedef函数改为:
void t_cpp_generator::generate_typedef(t_typedef* ttypedef) {
**以下是新增内容
    if (ttypedef->has_doc())
        f_types_ << indent() << "//" << ttypedef->get_doc();
**以上是新增内容
  f_types_ << indent() << "typedef " << type_name(ttypedef->get_type(), true) << " "
           << ttypedef->get_symbolic() << ";" << endl << endl;
}
  • 521行新增
if (first) {
      first = false;
    } else {
      f << "," << endl;
    }
**以下是新增内容
if (strlen(prefix) == 0)
    {
        if ((*c_iter)->has_doc())
            indent(f) << "//" << (*c_iter)->get_doc();
    }
**以上是新增内容
indent(f) << prefix << (*c_iter)->get_name() << suffix;
  • 544行新增
if (!gen_pure_enums_) {
    enum_name = "type";
    **以下是新增内容
    if (tenum->has_doc())
        f_types_ << indent() << "//" << tenum->get_doc();
    **以上是新增内容
    f_types_ << indent() << "struct " << tenum->get_name() << " {" << endl;
    indent_up();
  }
  • 1029行新增
  out << endl;
  **以下是新增内容
  if (tstruct->has_doc())
      out << indent() << "//" << tstruct->get_doc();
  **以上是新增内容
  // Open struct def
  • 1101行的整个for循环改为:
  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
    indent(out) << declare_field(*m_iter,
                                 false,
                                 (pointers && !(*m_iter)->get_type()->is_xception()),
                                 !read) << endl;
  }
  • 2181行新增:
  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
  **以下是新增内容
      generate_java_doc(f_header_, *f_iter);
  **以上是新增内容
    t_struct* arglist = (*f_iter)->get_arglist();
  • 2273行新增
  if (tservice->has_doc())
      f_header_ << "//" << tservice->get_doc();
  • 2383行新增
generate_java_doc(f_header_, *f_iter);

要改的地方有点多,因为他们分别是处理不同的field

三、编译compiler

打开解决方案”compiler\cpp\compiler.sln”,编译为thrift.exe
并使用thrift.exe来生成cpp代码文件。

四、效果

这里写图片描述

五、浅谈thrift的语法分析

compiler\cpp\src\thrift\thriftl.ll文件里定义了语法分析的一些配置。在其115行里开始:

intconstant   ([+-]?[0-9]+)
hexconstant   ([+-]?"0x"[0-9A-Fa-f]+)
dubconstant   ([+-]?[0-9]*(\.[0-9]+)?([eE][+-]?[0-9]+)?)
identifier    ([a-zA-Z_](\.[a-zA-Z_0-9]|[a-zA-Z_0-9])*)
whitespace    ([ \t\r\n]*)
sillycomm     ("/*""*"*"*/")
multicm_begin ("/*")
doctext_begin ("/**")
comment       ("//"[^\n]*)
unixcomment   ("#"[^\n]*)
symbol        ([:;\,\{\}\(\)\=<>\[\]])
literal_begin (['\"])

可以看到”/**”被定义为”doctext_begin”,而doctext就是注释了。
简单来讲就是thrift的语法分析用了第三方工具(GNU bison),而这个库是能够分析出注释的,还能分析出更多的东西。只是thrift的代码生成器(compiler)没有使用这些特性罢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值