Visual c++ 如何定义一个宏来记录C中的函数调用?

Visual c++ 如何定义一个宏来记录C中的函数调用?,visual-c++,macros,c-preprocessor,Visual C++,Macros,C Preprocessor,我发现一些代码用宏名称包装函数调用 问题是如何定义NAME宏,以便它使用TRACE记录正在调用的函数 类似于定义NAMEx-TRACEx;x不起作用,因为用名称宏包装的函数可能会返回东西,有时它们会像上面的示例那样使用 注意,这必须与VC++2010编译器配合使用。我不能100%确定跟踪是如何工作的,但我想向您介绍。我不能100%确定跟踪是如何工作的,但我想向您介绍。这可能会满足您的要求: #define NAME(x) (TRACE(#x), x) 请注意,您可以将函数指示符括在括号中,例如

我发现一些代码用宏名称包装函数调用

问题是如何定义NAME宏,以便它使用TRACE记录正在调用的函数

类似于定义NAMEx-TRACEx;x不起作用,因为用名称宏包装的函数可能会返回东西,有时它们会像上面的示例那样使用


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

我不能100%确定跟踪是如何工作的,但我想向您介绍。

我不能100%确定跟踪是如何工作的,但我想向您介绍。

这可能会满足您的要求:

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

请注意,您可以将函数指示符括在括号中,例如,允许使用strlenfo。

这可能会满足您的要求:

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

请注意,您可以将函数指示符括在paranthesis中,例如,strlenfo是允许的。

我不确定您的一般问题是否有解决方案

如果你使用GCC,如果它是最近的版本4.6,你可以考虑制作一个GCC插件,它将替换你的一些调用,例如一个调用序列,这将替换你的程序内部GCPC内部的GUPLE表示,一个类似x= Fy,z的调用,序列类似Debug Grimt2y,z;x=fy,z;调试打印1Z等。


但是在C.代码中,这并不太简单,您可以考虑使用高级领域特定语言来扩展GCC。但无论如何,扩展GCC并不十分简单,只有当您的应用程序足够大时,才需要几周的工作是值得的。我不确定是否有一个解决与GCC相关的一般问题的方法

如果你使用GCC,如果它是最近的版本4.6,你可以考虑制作一个GCC插件,它将替换你的一些调用,例如一个调用序列,这将替换你的程序内部GCPC内部的GUPLE表示,一个类似x= Fy,z的调用,序列类似Debug Grimt2y,z;x=fy,z;调试打印1Z等。


但是在C.代码中,这并不太简单,您可以考虑使用高级领域特定语言来扩展GCC。但无论如何,扩展GCC并不是很简单,只有当您的应用程序足够大时,才值得花上几周的时间,因为GCC有一个名为。它允许您在每次函数调用时收到通知并采取操作,例如记录。也许您可以将部分代码导入linux,或者VS也有类似的选项。

对于gcc,有一个名为。它允许您在每次函数调用时收到通知并采取操作,例如记录。也许您可以将部分代码导入linux,或者VS也有类似的选项。

我有一个类似的问题,我想在使用调试器时使用Visual Studio 2005的跟踪宏在输出窗口中显示日志。然而,源文件是C源,不是C++,也没有用任何方式使用MFC框架,所以我被卡住了。 然后我找到了这篇文章,它首先描述了跟踪宏,然后描述了一些其他机制。我选择使用的是_RPT1宏,它允许我将跟踪类型消息放入C源文件中Visual Studio调试器的输出窗口

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


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

我有一个类似的问题,我想在使用时使用Visual Studio 2005的跟踪宏在输出窗口中显示日志调试器。然而,源文件是C源,不是C++,也没有用任何方式使用MFC框架,所以我被卡住了。 然后我找到了这篇文章,它首先描述了跟踪宏,然后描述了一些其他机制。我选择使用的是_RPT1宏,它允许我将跟踪类型消息放入C源文件中Visual Studio调试器的输出窗口

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


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

@sorin:不,你没有。NAMExfoo的值是调用xfoo的结果。@sorin:想想看:a=NAMExfoo;TRACE不在gcc中?@sorin:不,你不在。NAMExfoo的值是调用xfoo的结果。@sorin:想想看:a=NAMExfoo;跟踪不在gcc中?