【问题标题】:Detecting functions using C/C++ [closed]使用 C/C++ 检测函数 [关闭]
【发布时间】:2014-02-26 07:00:03
【问题描述】:

我有一个包含很多文件的项目,我想为每个文件中的每个函数添加一个简单的“printf”命令。请分享您关于如何以编程方式检测函数的想法。

【问题讨论】:

  • 通过编程方式,您是指将代码文件扫描为文本文件的程序?
  • 一般来说,你应该表现出自己的一些努力,让别人来帮助你。
  • 你要扣什么?是函数名吗
  • @SharonJDDorot 是的,一个读取 .c 文件的程序,检测其中的所有函数并为每个函数添加一个“printf”。

标签: c++ c function parsing


【解决方案1】:

虽然我讨厌成为那个人并立即告诉你你做错了,但我不知道你真正想用这个完成什么(需要进一步解释吗?),您将使用调试器或分析器更深入地了解您的代码。如果您想查看导致程序中某些事件(如崩溃)的所有函数调用,请尝试 gdb。如果您想了解函数被调用的频率,请查看 Valgrind 或 gprof 之类的东西。以下问题详细介绍了 C++ 分析:

What can I use to profile C++ code in Linux?

但是,如果您真的决定在每个函数中都使用 printf,我会使用第三方工具来进行 C++ 解析。尝试编写正则表达式来自己解析 C++ 将是一个令人沮丧的练习。

CScope 可能是最简单的“现成”解决方案:http://cscope.sourceforge.net/ 请注意,对于模板编程繁重的 C++ 代码,它可能会遇到问题。

如果您想在这方面投入更多时间,使用开源 clang 编译器开发解决方案将使您能够做出非常全面的事情。查看http://clang.llvm.org/

你正在做的事情的例子:Get list of methods in class using clang

希望对您有所帮助...

【讨论】:

  • 除了模板,CScope 的 lambda 也很有趣。
【解决方案2】:

使用 __FUNCTION____LINE__ 宏。希望这会有所帮助

#define PRINT_FUNC_NAME() do{printf("Entered the function %s in line no %d",__FUNCTION__,__LINE__)}while(0)

示例程序

#include<iostream>
using namespace std;
#define PRINT_FUNC_NAME() do {printf("Entered the function %s in line no %d\n",__FUNCTION__,__LINE__) } while(0)


void callme()
{
   PRINT_FUNC_NAME();
}
int main()
{
   PRINT_FUNC_NAME();
      callme();
   return 0;
}

【讨论】:

  • 永远不要在宏中隐藏;。而是在每次调用后使用;。这有助于使代码具有可读性。同样对于这样一个明确执行功能的宏,当定义为功能宏并调用为PRINT_FUNC_NAME()时,它更容易阅读。
  • do{ printf("blahblah")l } while(0) 通常是推荐使用宏的方法。
  • @JensGustedt 根据您的建议进行了编辑。谢谢
  • @Stolas 我不清楚你的说法。请澄清
  • @Stolas 真的帮了我大忙。注意我的编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
相关资源
最近更新 更多