让svn diff在提交时显示C++函数

6
每次我在svn中进行提交循环时,在编写注释时会检查差异。我认为在显示差异时显示实际进行修改的函数将非常好。我查看了this page,其中提到-p选项将显示更改所在的C函数。然而,当我尝试在一些C++代码中使用-p选项时,它通常返回访问说明符(private、public、protected等),这并不是特别方便。我注意到diff有一个-F选项,与-p相同,但需要用户指定正则表达式。我想知道:是否有一个简单的正则表达式来匹配C++函数?似乎这就足以使其起作用。我会花些时间自己研究这个问题,但工作处于紧急模式,我认为很多人都会发现这个问题有用,所以我决定在这里发布。

编辑:我不是在寻找一个完美的正则表达式,但是希望能够找到最接近diff区域上方的函数定义。即使它并不完美,有些错误也可以接受。只要它能正确工作,也许能提高60%的生产力,这对我来说已经很重要了。

4个回答

3

有没有一个简单的正则表达式来匹配C++函数?没有。

有没有(复杂的)正则表达式来匹配C++?可能或者说有可能写一个。

但我要说的是,正则表达式既不容易胜任这样的任务(如果您想要某种确切的匹配),也不是这样的任务的正确工具。

就像这种情况一样。你会如何处理这些东西呢?

void (*function(int, void (*)(int)))(int);

func1(int), func2(double); double func3(int);

唯一真正的解决方案是使用使用yacc/lex编写的解析器。但对于您的用例,这当然没有任何作用。
因此,要么拼凑一些不完整的正则表达式来适应代码中的大多数函数签名,要么就无能为力。

嗯...我想这个问题的解决方案比我想象的要复杂得多。 - J. Polfer

2
如果你只打算将这个应用于你自己的提交,我建议养成给函数添加提交注释的习惯,例如:
void something () 
{
    ...
    some thing = 1;
    ...
}

to

void something () 
// last change by me: a better value for thing
{
    ...
    some thing = 2;
    ...
}

它将为您显示函数带有编辑的注释。作为奖励,其他人将能够理解您正在做什么。


+1,很好的开箱即用答案;这也许是我本应该做的事情。 - J. Polfer
是的,我认为一般来说人们高估了全局提交注释的重要性,低估了内联注释的重要性。 - ilya n.
我一直在寻找一个简单的正则表达式,可以捕获形如 <type> <class>::<function_name>(<parameters>) 的函数调用。你能想出一个匹配这种格式的正则表达式吗? - J. Polfer

1

TortoiseSVN在其C++文件提交对话框中使用以下正则表达式来支持自动完成:

.h, .hpp, .hxx = ^\s*(?:class|struct)\s+([\w_]+)|\W([\w_]+)\(
.cpp, .c, .cxx = \W(([\w_]+)::([\w_]+))|\W([\w_]+)\(

虽然我不知道它们有多准确。


他们真是糟糕:例如 void hallo () { 不被识别为函数签名。 - jitter
看起来他们需要命名空间声明,在那里看到了“::”。 - Joey
但我不提供任何 :) 使用命名空间 std; - jitter

1

我不知道SVN中是否有这样的选项,基于正则表达式的解决方案可能会出现以下一种或多种情况:

  • 代码和维护难度大,有很多特殊情况
  • 不正确,并且缺少几个有效的C++函数

你需要某种解析器来解决这个问题。技术上可以枚举所有可能的正则表达式情况,但编写解析器是解决此问题的正确方法。如果你有时间自己开发解决方案,建议查看ANTLR,他们在此页面上提供了几个C/C++语法:

ANTLR Grammar Lists


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接