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

本文介绍了一种在VC++中使用宏进行编程的方法,并提供了一个实用的代码示例,展示了如何自动生成文件头部注释及函数注释,提高代码规范性和可读性。

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

,一、先测试如果不能运行宏,则要先在工具里设置容许,如果还不行就安sp1补丁
二、具体地址:
http://www.cppblog.com/eday/archive/2007/07/15/28079.html
三、可以对其进行小量的修改用于自己的vc编程,虽然用vs小助手,但写函数的时候它肯定不会自动读出参数列表的,自己写多麻烦。

//下面这个是在这位达人上修改的版本,适合自己的使用,主要还是那个函数的参数,不想让它有一个类型。

 '
' Copyright(C) 2007,松鼠网络工作室 保留所有权利。( All rights reserved. )
‘ 在作者上的小小修改
,http://www.cppblog.com/eday/archive/2007/07/15/28079.html

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

Public Module JU
    ' --------------------------------------------------
    ' 生成文件说明注释
    ' --------------------------------------------------
    Sub 文件头()
        Dim gAuthor As String = "JU"
        Dim gCompany As String = "JU"

        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("-----------------------------------------------------------------------------" + vbCrLf)
        outText.Insert(" * Copyright(C) " + Date.Today.Year.ToString() + "," + gCompany + " 保留所有权利。( All rights reserved. )" + 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)
        outText.Insert("-----------------------------------------------------------------------------" + vbCrLf)
        outText.Insert(" */" + vbCrLf)
        DTE.ActiveDocument.Selection.GotoLine(10)
    End Sub
    ' --------------------------------------------------
    ' 生成函数说明注释
    ' --------------------------------------------------
    Sub 空函数说明()
        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)
    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

                '以空格分隔的第二个
                Dim strParamTwo As String = strItem.Trim()
                Dim strParamName As String() = strParamTwo.Split(" ")
                Dim strParam As String
                For Each strParam In strParamName
                    '只有第二个才是,如果是=号说明是默认的参数
                    If strParam.Trim() = "=" Then
                        Exit For
                    End If
                    idata.itemText = strParam.Trim()
                Next strParam
                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 函数说明()
        Dim preSpaceCount As Integer = 4   ' 注释前面的空格数, 缩进(单位:字符)
        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 + "// @name        " + idata.itemText + "()" + vbCrLf)
                    outText.Insert(strSpace + "// @description " + vbCrLf)
                Case 2
                    If pcount = 0 Then
                        'outText.Insert(strSpace + "// @param " + vbCrLf)
                    End If
                    pcount = pcount + 1
                    outText.Insert(strSpace + "// @param       [in] " + 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 + "// @return      " + vbCrLf)
        outText.Insert(strSpace + "// @note        " + vbCrLf)
        'outText.Insert(strSpace + "//-----------------------------------------------------------" + vbCrLf)
        lItemList.Clear()   '清除所有
    End Sub
    Sub 简单说明()
        iCurrentLineNumber = DTE.ActiveDocument.Selection.CurrentLine.ToString()
        outTextDoc = DTE.ActiveDocument.Object("TextDocument")
        outText = outTextDoc.StartPoint.CreateEditPoint()
        ' 移动文本输入点到指定行上
        outText.MoveToLineAndOffset(iCurrentLineNumber, 1)

        outText.Insert("/**" + vbCrLf)
        outText.Insert("*/" + vbCrLf)
    End Sub
    '
End Module


效果:
1,文件头
利用宏来生成C++函数的注释 - 熊哥 - 熊哥

2.函数说明
利用宏来生成C++函数的注释 - 熊哥 - 熊哥

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值