搜索具有特定签名调用的函数? 假设我有一些C++函数: void A(int i) { /* some code */ } void A(string s) { /* some code */ } void A(string s, int i) { /* some code */ }

搜索具有特定签名调用的函数? 假设我有一些C++函数: void A(int i) { /* some code */ } void A(string s) { /* some code */ } void A(string s, int i) { /* some code */ },c++,function,debugging,signature,trace,C++,Function,Debugging,Signature,Trace,假设第一个调用占A()调用的80%,第二个调用占15%,最后一个调用占5% 我想对电话进行静态跟踪。如果我对第一种调用感兴趣,没问题,“A”()的大多数字符串搜索结果都是类型1,但是如果我只想要类型2或类型3,那么类型1会产生很多不必要的噪音 对于类型3,如果我查找括号a(*,*,*)(我不知道RE的编程语法)之间正好有2个COMA的以下字符串,正则表达式会有所帮助 但对于第二类,这是行不通的 有什么技术可以用来通过函数的签名找到函数调用吗 编辑:我所说的“跟踪”是指通过找到所需函数的所有调用点

假设第一个调用占A()调用的80%,第二个调用占15%,最后一个调用占5%

我想对电话进行静态跟踪。如果我对第一种调用感兴趣,没问题,“A”()的大多数字符串搜索结果都是类型1,但是如果我只想要类型2或类型3,那么类型1会产生很多不必要的噪音

对于类型3,如果我查找括号
a(*,*,*)
(我不知道RE的编程语法)之间正好有2个COMA的以下字符串,正则表达式会有所帮助

但对于第二类,这是行不通的

有什么技术可以用来通过函数的签名找到函数调用吗

编辑:我所说的“跟踪”是指通过找到所需函数的所有调用点来理解当前代码库

对于类型3,如果我查找以下字符串,该字符串在括号a(,*)之间正好有2个comas,则正则表达式会有所帮助(我实际上不知道RE的编程语法)

但对于第二类,这是行不通的

有什么技术可以用来通过函数的签名找到函数调用吗

除了使用一些正则表达式(例如记事本++文件搜索、egrep或类似工具)搜索文件外,假设您能够更改声明/定义这些函数的源代码,您还可以使用一些编译器标准功能,如属性:

   void A(int i) {
   /* some code */
   }

   [[deprecated]] void A(string s) {
// ^^^^^^^^^^^^^^
   /* some code */
   }

   [[deprecated]] void A(string s, int i) {
// ^^^^^^^^^^^^^^
   /* some code */
   }
使用这些功能时,将显示警告:

int main() {
    A(5);
    A("Hello");
    A("Hello",42);
}
请参阅使用g++编译的

您甚至可以用一条消息来装饰它,让您的同事维护代码库:

   [[deprecated("Get rid of these performance killing calls."
                " Use A(A::getPrecomputedHash(s)) instead.")]] 
      void A(string s) {
      }

“我想静态跟踪这些呼叫。”跟踪的确切含义是什么?您使用的是日志框架,还是希望将其设置为调试器的断点条件?您可能正在寻找。libtooling工具非常适合编写自定义工具来搜索/查询/操作AST。如果这是您自己的代码,则有一个非常简单实用的解决方案:排除
void A(string s)
并重新生成完整的项目。之后,每当以这种方式调用函数
A()
时,就会出现编译器错误。当然,这有一定的限制-编译器可以选择另一个
A()
(从另一个命名空间或通过对参数应用转换)-我的意思是这部分是严重的:每当我不能改变我们的LIB的某些基本行为时,我会考虑一个“API中断”来找到所有必须重新访问/检查的地方。@ Scheff“我的意思是部分地严重”。那么,在当前的标准中,我们不是有属性吗?这将解决你提到的限制。@πάνταῥεῖ 因此,与其排除它,不如将其标记为
[[deprecated]]
并重建任何内容?好主意。我不确定VS2013是否已经支持它,但总有一天我们肯定会切换…;-)
   [[deprecated("Get rid of these performance killing calls."
                " Use A(A::getPrecomputedHash(s)) instead.")]] 
      void A(string s) {
      }