我发现一些代码用宏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编译器一起使用。
答案 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宏的替代方法。