如何定义一个可用于在C中记录函数调用的宏?

时间:2011-10-27 14:18:10

标签: visual-c++ macros c-preprocessor

我发现一些代码用宏NAME()包装函数调用,

#define NAME(x) x
...
m_strTemp.Format("x key:0x%X", NAME(a_function)(a_param));

问题是如何定义NAME()宏,以便使用TRACE()记录被调用的函数。

#define NAME(x) TRACE("x");x之类的东西不起作用,因为NAME()宏包装的函数可能会返回内容,有时会像上面的示例一样使用它们。

注意,这必须与VC ++ 2010编译器一起使用。

5 个答案:

答案 0 :(得分:6)

这可能会做你想要的:

#define NAME(x) (TRACE(#x), x)

(请注意,您可以将函数指示符括在parantheses中,例如。(strlen)("foo")是允许的。)

答案 1 :(得分:1)

我不是100%确定TRACE如何运作,但我想引导您转到# macro quoting operator

答案 2 :(得分:0)

我不确定您的一般问题是否有解决方案(与Aspect Oriented Programming相关)。

如果您使用GCC并且它是最新版本(4.6),您可以考虑制作一个GCC插件,用以替换您的某些电话。一系列调用,它将替换程序内部Gimple表示(GCC内部),类似x=f(y,z)的调用,如debugprint2(y,z); x=f(y,z); debugprint1(z)等序列。 但是在C中编码并不是很简单。您可以考虑使用GCC MELT(一种高级域特定语言来扩展GCC)对其进行编码。但是,无论如何,扩展GCC并不是很简单,只有当你的应用程序足够大时才值得(需要几周的工作)

答案 3 :(得分:0)

对于gcc,有一个名为gcc function instrumentation的功能。它允许您收到每个函数调用的通知并采取操作(例如日志记录)。也许你可以将部分代码导入linux,或者VS也有类似的选择。

答案 4 :(得分:0)

我有一个类似的问题,我想在使用调试器时使用Visual Studio 2005的TRACE宏在输出窗口中显示日志。但是源文件是C源代码而不是C ++,也没有以任何方式使用MFC框架,所以我被卡住了。

然后我发现这篇文章Debugging with Visual Studion 2005/2008: Logging and Tracing首先描述了TRACE宏,然后介绍了其他一些机制。我选择使用的是_RPT1()宏,它允许我将一个TRACE类型的消息放入C源文件中的Visual Studio调试器的输出窗口。

它需要包含crtdbg.h头文件,就像各种TRACE宏一样,根据参数的数量,有几个不同的_RPT宏。

这不是这个特定问题的答案,但是我想记录这种在Visual Studio 2005中获取调试输出的方法,作为C源文件中TRACE宏的替代方法。