• [转]利用宏来生成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 StringAs 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(01<> ")" 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

  • 相关阅读:
    知识积累的核心:解构、重构
    常用的测试用例设计方法
    安装双系统注意事项
    对象转换工具类
    一个超级简单的HTML模板框架源代码以及使用示例
    java常量池
    维数灾难
    机器学习算法思想简单梳理
    对线性代数的一些理解
    正则表达式 java版
  • 原文地址:https://www.cnblogs.com/JohnShao/p/2000525.html
Copyright © 2020-2023  润新知