Visual Studio的宏 - 入门| 从的.cpp复制定义的.h(Visual studi

2019-10-20 19:20发布

是否有可能做一个宏,拷贝函数的定义声明(以及可能还有对面)? 例如

Foo::Foo(int aParameter, int bParameter){
    //
}

int Foo::someMethod(char aCharacter) const {
    return 0;  
}

从.cpp文件将是:

class Foo {
    Foo(int aParameter, int bParameter);

    int someMethod(char aCharacter) const;
};

在.cpp文件。

也:

如果有任何人有良好的教程或文档的知识,旨在Visual Studio .NET中(也许还包括上述问题),我可能会接受,作为一个答案,以及

Answer 1:

不,这是下一个到不可能得到100%可靠。 你必须写一个C ++语言解析器能够准确地抬起类名报关单和处理类似默认参数值和缺失参数名的复杂性。 编写C ++解析器是很难用任何语言,但你会发现特别是缺乏VBA。

退房视觉辅助 。 他们的网站被降权现在(嗯,哦),无法给你一个准确的链接。



Answer 2:

这不是漂亮或快,但它的工作。
使用记录宏功能和浏览的对象浏览器以获得电话,然后打补丁一起。
我的视觉基础知识是有限的,所以对代码的任何反馈将是非常有益的 。 举例来说,我在尝试找到当一个巨大的放缓class <name> {一行。 任何提示,以加快这?

Imports EnvDTE

Public Module Module1
    Function getFileName(ByRef str As String) As String
        If (str = "main.cpp") Then
            Return ""
        Else
            Dim pos As Integer
            pos = InStr(str, ".cpp")
            If (pos = 0) Then
                ' not a .cpp file.'
                Return ""
            Else
                Dim header As String
                header = Left(str, pos - 1)
                Return header
            End If
        End If
        Return ""
    End Function

    Function getParts(ByRef str As String, ByRef returnvalue As String, ByRef classname As String, ByRef identifier As String, ByRef arguments As String) As String
        ' common function looks like:'
        '   <return_value> <classname>::<identifier>([arguments])[{]'
        '                 ^divider    ^colonposition            ^parenthesisEnd'
        '                  ^classnamepos            ^parenthesisStart'
        ''
        ' exceptions: ctor and dtor'
        '   <classname>::[~]<classname>([arguments])[{]'

        Dim colonposition As Integer
        Dim classnameposition As Integer
        Dim divider As Integer
        Dim divider2 As Integer
        Dim parenthesisStart As Integer
        Dim parenthesisEnd As Integer

        colonposition = InStr(str, "::")
        parenthesisStart = InStr(str, "(")
        parenthesisEnd = InStr(str, ")")
        If (colonposition = 0 Or parenthesisStart = 0 Or parenthesisEnd = 0) Then
            Return "Not a function line" ' no colons or parenthesis found? maybe not a function line'
        End If

        divider = InStr(str, " ")

        ' do we have a ctor/dtor?'
        If (divider > colonposition Or divider = 0) Then

            Return "constructor or destructor"
        End If
        ' this might be a function'
        While True
            divider2 = InStr(divider + 1, str, " ")
            If (divider2 > colonposition) Then
                Exit While
            End If
            divider = divider2
        End While
        ' now we have the full return value in 0 -> divider-1'
        returnvalue = Left(str, divider - 1)
        ' and the classname as well'
        classname = Left(Right(str, str.Length - divider), colonposition - divider - 1)
        'indentifier is right after the :: and before the parenthesis'
        identifier = Left(Right(str, str.Length - colonposition - 1), parenthesisStart - colonposition - 2)
        ' and not to mention the arguments between the parenthesis'
        arguments = Left(Right(str, str.Length - parenthesisStart), parenthesisEnd - parenthesisStart - 1)


        Return "Success"
    End Function

    Sub getDefinition()
        Dim sourcefile As String
        Dim filename As String
        Dim header As String
        Dim returnvalue As String
        Dim classname As String
        Dim identifier As String
        Dim arguments As String

        Dim str As String
        Dim line As String
        Dim pos As Integer


        sourcefile = DTE.ActiveDocument.Name
        ' get the filename for the current file (without the extension)'
        filename = getFileName(sourcefile)
        If (filename.Length = 0) Then
            MsgBox("Im not in a .cpp file", , "GetDefinition")
            Return
        End If

        ' get the current line'
        DTE.ActiveDocument.Selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn)
        DTE.ActiveDocument.Selection.EndOfLine(True)
        line = DTE.ActiveDocument.Selection.Text()
        ' now interpret the line'
        str = getParts(line, returnvalue, classname, identifier, arguments)
        If (Not str = "Success") Then
            MsgBox(str, , "GetDefinition")
            Exit Sub
        End If
        ' the str should be put into the header file as of:'
        ' class <classname>[:<base>][{]'
        ' [{]'
        '     <--- somewhere here'
        ' }'

        ' attach the header ending'
        header = filename + ".h"
        ' activate the header file'
        DTE.Windows.Item(header).Activate()
        DTE.ActiveDocument.Selection.StartOfDocument()


        While (True)
            DTE.ActiveDocument.Selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn)
            DTE.ActiveDocument.Selection.EndOfLine(True)
            line = DTE.ActiveDocument.Selection.Text()
            pos = InStr(line, classname)
            If (Not pos = 0) Then
                Exit While
            End If
            DTE.ActiveDocument.Selection.LineDown(False, 1)
        End While
        ' found the class definition'
        While (True)
            pos = InStr(line, "{")
            If (Not pos = 0) Then
                Exit While
            End If
            DTE.ActiveDocument.Selection.LineDown(False, 1)
        End While
        DTE.ActiveDocument.Selection.EndOfLine(False)
        DTE.ActiveDocument.Selection.NewLine()

        DTE.ActiveDocument.Selection.Text = returnvalue & " " & identifier & "(" & arguments & ");"


    End Sub
End Module


Answer 3:

于是,我找到了Visual Studio的自动化和扩展 ,覆盖我试图做的东西,从对象浏览器并记录宏功能的帮助不大。

我想我应该可以在这里解决。



文章来源: Visual studio macro - getting started | copy a definition from .cpp to .h