是否可以执行将函数定义复制到声明的宏(也可能相反)?例如
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的良好教程或文档(也可能还包括上述问题),我可能会接受这个作为答案
答案 0 :(得分:1)
不,这几乎不可能100%可靠。您必须编写一个C ++语言解析器,以便能够准确地从声明中提取类名,并处理复杂性,如默认参数值和缺少参数名称。编写C ++解析器在任何语言中都很难,但你会特别发现VBA缺乏。
结帐Visual Assist。他们的网站现在已经关闭了(呃哦),无法给你一个准确的链接。
答案 1 :(得分:0)
它并不美观或快速,但确实有效
使用记录宏功能并浏览对象浏览器以获取呼叫,然后将其打包在一起
我的视觉基础知识是有限的,所以对代码的任何反馈都会非常有用。例如,在尝试找到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
答案 2 :(得分:0)
所以,我找到了Automation and Extensibility for Visual Studio,它涵盖了我想要做的事情,在对象浏览器和记录宏功能的帮助下。
我想我应该可以从这里解决它。