您的位置:首页 > 编程语言 > C语言/C++

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

2011-03-31 04:52 477 查看
一直用来函数注释的宏找不到了,找了一下午终于找到了文章原版,转到这里保存一下。

//////////////////////////////////////////////////////////////////////////////////////////////////////

在定义函数时,一直以来都是手工加入函数注释,虽然每个函数的注释内容并不是太多,但总是会有很多重复性的工作,哎。这两天有点时间看看有什么方法了,昨天发现原来 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: