[转]利用宏来生成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
//////////////////////////////////////////////////////////////////////////////////////////////////////
在定义函数时,一直以来都是手工加入函数注释,虽然每个函数的注释内容并不是太多,但总是会有很多重复性的工作,哎。这两天有点时间看看有什么方法了,昨天发现原来 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
相关文章推荐
- 利用宏来生成C++函数的注释
- eclipse develop for C\C++ 文件注释函数注释代码模板自动生成方法
- [原创]Enterprise Architecture V7.5 C++代码生成时,头文件中函数声明没有注释,CPP中函数定义却有注释。
- C++学习 【4.3】 利用函数实现指定的功能---内置函数
- Eclipse c++注释模板以及注释文档生成
- Effective C++ Item 6 若不想使用编译器自动生成的函数,就该明确拒绝
- 利用Eclipse自动生成comments(注释)
- 今晚我最得意之作——利用Oracle超级无敌强大函数生成“批量生成数据语句”!
- 使用Angularjs获取数组中的值利用一个函数的返回值来决定相应的dom是否生成
- C++ 用利用函数求 m,n的最大公约数
- c++定义一个空类 系统会自动生成四种函数
- 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数
- C/C++ 类默认生成的四个函数
- C++使用WideCharToMultiByte函数生成UTF-8编码文件的方法
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- [原]C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数
- <Effective C++>:Item 6 :明确拒绝不想编译器自动生成的函数
- C++学习 【4.1】 利用函数实现指定的功能---函数,函数的形式,函数参数
- Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤
- C/C++利用位运算来进行函数参数检查