[转]利用宏来生成C++函数的注释

一直用来函数注释的宏找不到了,找了一下午终于找到了文章原版,转到这里保存一下。

//

在定义函数时,一直以来都是手工加入函数注释,虽然每个函数的注释内容并不是太多,但总是会有很多重复性的工作,哎。这两天有点时间看看有什么方法了,昨天发现原来 Vistual Studio 2005里有个宏IDE工具可以实现我的目的(嘿嘿见笑,怎么早没发现),研究一下了...,晕死是Basic语言,还好要实现我的功能不需要学习Basic太多的东西,简单看一下基本的语法,开始动手试试吧。

使用方法:
        在VS2005IDE的宏资源管理器中新建一个宏项目,然后编辑,添加下面的Basic代码保存,就可以使用了。

        首先将文本光标移到 InitInstance 函数所在的行上,然后双击运行宏资源管理器中的MakeFunctionRemark,这时在代码窗口中就可以自动创建该函数的基本注释内容(函数名称和参数等),效果下图


有个情况是我没去解决的(解析麻烦点),返回值部分。哪位有兴趣自己改吧。我只是在这里将不是返回值说明的(CALLBACK)手工删除处理。还有就是函数的声明只能在一行完成,该版本不支持分行声明。





'
'  Copyright(C) 2007,松鼠网络工作室 保留所有权利。( All rights reserved. )
'  
'  文件名称:DescriptionModule
'  摘    要:
'        FileDescription     - 生成文件说明注释
'        FunctionRemark      - 生成函数说明注释
'        MakeFunctionRemark  - 根据函数声明生成注释
'  当前版本:1.0
'  作    者:松鼠
'  创建日期:2007年7月15日
'

Option   Strict   Off
Option   Explicit   Off
Imports  System
Imports  EnvDTE
Imports  EnvDTE80
Imports  System.Diagnostics

Public   Module  DescriptionModule
     '  --------------------------------------------------
     '  生成文件说明注释
     '  --------------------------------------------------
     Sub  FileDescription()
         Dim  gAuthor  As   String   =   " 松鼠 "
         Dim  gCompany  As   String   =   " 松鼠网络工作室 "

         Dim  outTextDoc  As  TextDocument
         Dim  outText  As  EditPoint

        DTE.ActiveDocument.Selection.GotoLine( 1 )
        outTextDoc  =  DTE.ActiveDocument.Object( " TextDocument " )
        outText  =  outTextDoc.StartPoint.CreateEditPoint()
        outText.Insert( " /* "   +  vbCrLf)
        outText.Insert( "  * Copyright(C)  "   +   Date .Today.Year.ToString()  +   " , "   +  gCompany  +   "  保留所有权利。( All rights reserved. ) "   +  vbCrLf)
        outText.Insert( "  *  "   +  vbCrLf)
        outText.Insert( "  * 文件名称: "   +  DTE.ActiveDocument.Name  +  vbCrLf)
        outText.Insert( "  * 摘    要: "   +  vbCrLf)
        outText.Insert( "  * 当前版本:1.0 "   +  vbCrLf)
        outText.Insert( "  * 作    者: "   +  gAuthor  +  vbCrLf)
        outText.Insert( "  * 创建日期: "   +   Date .Today.ToLongDateString()  +  vbCrLf)
        outText.Insert( "  */ "   +  vbCrLf)
        DTE.ActiveDocument.Selection.GotoLine( 10 )
     End Sub
     '  --------------------------------------------------
     '  生成函数说明注释
     '  --------------------------------------------------
     Sub  FunctionRemark()
         Dim  preSpaceCount  As   Integer   =   0     '  注释前面的空格数, 缩进(单位:字符)
         Dim  outTextDoc  As  TextDocument
         Dim  outText  As  EditPoint
         Dim  iCurrentLineNumber  As   Integer

        iCurrentLineNumber  =  DTE.ActiveDocument.Selection.CurrentLine  ' .ToString()
        outTextDoc  =  DTE.ActiveDocument.Object( " TextDocument " )
        outText  =  outTextDoc.StartPoint.CreateEditPoint()
         '  移动文本输入点到指定行上
        outText.MoveToLineAndOffset(iCurrentLineNumber,  1 )
         Dim  strSpace  As   String   =   ""
         Dim  iSpaceIndex  As   Integer
         For  iSpaceIndex  =   1   To  preSpaceCount
            strSpace  =  strSpace  +   "   "
         Next
        outText.Insert(strSpace  +   " //----------------------------------------------------------- "   +  vbCrLf)
        outText.Insert(strSpace  +   " // 函数名称: "   +  vbCrLf)
        outText.Insert(strSpace  +   " //      "   +  vbCrLf)
        outText.Insert(strSpace  +   " // 参数: "   +  vbCrLf)
        outText.Insert(strSpace  +   " //    -  "   +  vbCrLf)
        outText.Insert(strSpace  +   " // 返回: "   +  vbCrLf)
        outText.Insert(strSpace  +   " //      "   +  vbCrLf)
        outText.Insert(strSpace  +   " // 说明: "   +  vbCrLf)
        outText.Insert(strSpace  +   " //      "   +  vbCrLf)
        outText.Insert(strSpace  +   " //----------------------------------------------------------- "   +  vbCrLf)
     End Sub
     '  --------------------------------------------------
     '
     '  函数注释解析部分
     '
     '  --------------------------------------------------
     Public   Structure  ITEMDATA
         Public  itemType  As   Integer
         Public  itemText  As   String
     End Structure
     Public  lItemList  As   New  System.Collections.Generic.List(Of ITEMDATA)( 4 )
     Private   Function  ParseFunctionDescription( ByVal  funText  As   String )  As   Boolean
         Dim  strItem  As   String
         Dim  idata  As  ITEMDATA
         Dim  strSplit  As   String ()  =  funText.Split( " ( " )

         If  strSplit.Length  =   1   Then
             Return   False
         End   If

         ' 解析函数名称部分
         If  strSplit.Length  >   2   Then
            strItem  =  strSplit(strSplit.Length  -   2 ).Trim()
         Else
            strItem  =  strSplit( 0 ).Trim()
         End   If
         Dim  strHeadSplit  As   String ()  =  strItem.Split( "   " )
        strItem  =  strHeadSplit(strHeadSplit.Length  -   1 ).Trim()
        idata.itemType  =   1
        idata.itemText  =  strItem.Trim()
        lItemList.Add(idata)

         ' 解析参数部分
        strItem  =  strSplit(strSplit.Length  -   1 ).Trim()
         If  strItem.Substring( 0 ,  1 )  <>   " ) "   Then
             Dim  iend  As   Integer   =  strItem.IndexOf( " ) " ,  0 )
             Dim  strParams  As   String   =  strItem.Substring( 0 , iend).Trim()
             Dim  strParamSplit  As   String ()  =  strParams.Split( " , " )
             For   Each  strItem  In  strParamSplit
                idata.itemType  =   2
                idata.itemText  =  strItem.Trim()
                lItemList.Add(idata)
             Next  strItem
         Else
            idata.itemType  =   2
            idata.itemText  =   " 无参数 "
            lItemList.Add(idata)
         End   If
         ' 解析返回值类型
         Dim  iIndex  As   Integer
         For  iIndex  =   0   To  strHeadSplit.Length  -   2
            idata.itemType  =   3
            idata.itemText  =  strHeadSplit(iIndex).Trim()
            lItemList.Add(idata)
         Next  iIndex
         Return   True
     End Function
     '  --------------------------------------------------
     '
     '  根据函数声明生成注释
     '
     '  --------------------------------------------------
     Sub  MakeFunctionRemark()
         Dim  preSpaceCount  As   Integer   =   0     '  注释前面的空格数, 缩进(单位:字符)
         Dim  outTextDoc  As  TextDocument
         Dim  outText  As  EditPoint
         Dim  iCurrentLineNumber  As   Integer
         Dim  iLineLength  As   Integer
         Dim  strFunText  As   String
         Dim  iItemIndex  As   Integer
         Dim  idata  As  ITEMDATA

        lItemList.Clear()

        iCurrentLineNumber  =  DTE.ActiveDocument.Selection.CurrentLine.ToString()
        outTextDoc  =  DTE.ActiveDocument.Object( " TextDocument " )
        outText  =  outTextDoc.StartPoint.CreateEditPoint()
         '  移动文本输入点到指定行上
        outText.MoveToLineAndOffset(iCurrentLineNumber,  1 )
        iLineLength  =  outText.LineLength
        strFunText  =  outText.GetText(iLineLength)
        iLineLength  =  strFunText.Trim().Length
         ' 但前行没有内容直接返回
         If  iLineLength  =   0   Then
             Return
         End   If

         '  解析函数名称
         Dim  bResult  As   Boolean   =  ParseFunctionDescription(strFunText.Trim())
         If  bResult  =   False   Then
            lItemList.Clear()
             Return
         End   If

         Dim  pcount  As   Integer   =   0
         Dim  rcount  As   Integer   =   0
         Dim  strSpace  As   String   =   ""
         Dim  iSpaceIndex  As   Integer
         For  iSpaceIndex  =   1   To  preSpaceCount
            strSpace  =  strSpace  +   "   "
         Next
        outText.Insert(strSpace  +   " //----------------------------------------------------------- "   +  vbCrLf)
         For  iItemIndex  =   0   To  lItemList.Count  -   1
            idata  =  lItemList.Item(iItemIndex)
             Select   Case  idata.itemType
                 Case   1
                    outText.Insert(strSpace  +   " // 函数名称: "   +  vbCrLf)
                    outText.Insert(strSpace  +   " //      "   +  idata.itemText  +  vbCrLf)
                 Case   2
                     If  pcount  =   0   Then
                        outText.Insert(strSpace  +   " // 参数: "   +  vbCrLf)
                     End   If
                    pcount  =  pcount  +   1
                    outText.Insert(strSpace  +   " //    -  "   +  idata.itemText  +  vbCrLf)
                 Case   3
                     If  rcount  =   0   Then
                        outText.Insert(strSpace  +   " // 返回: "   +  vbCrLf)
                     End   If
                    rcount  =  rcount  +   1
                    outText.Insert(strSpace  +   " //      "   +  idata.itemText  +  vbCrLf)
                 Case   4
                 Case   5
             End   Select
         Next
        outText.Insert(strSpace  +   " // 说明: "   +  vbCrLf)
        outText.Insert(strSpace  +   " //      "   +  vbCrLf)
        outText.Insert(strSpace  +   " //----------------------------------------------------------- "   +  vbCrLf)
        lItemList.Clear()    ' 清楚所有元素
     End Sub
End Module


另外两个函数使用方法同上 
FileDescription     - 生成文件说明注释


FunctionRemark      - 生成函数说明注释(空注释)


如果要修改注释前面缩进空格,可以修改Basic代码中的 preSpaceCount  变量值。

在VS2005(VC++)下测试通过, 没用过其他版本的开发工具(未验证),初次写Basic代码,有不对的地方还请见谅!
看了MSDN中对宏的介绍,功能确实很爽,有时间再研究研究了。。。。

TrackBack:http://www.cppblog.com/eday/archive/2007/07/15/28079.html

转载于:https://www.cnblogs.com/JohnShao/archive/2011/03/31/2000525.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值