我正在为一个用C语言编写的自动化系统开发一些模块,需要与硬件进行大量的工作。我发现没有简单的方法(像传统的方式)来调试事物,而不是跟踪日志。因此,我正在寻找记录函数调用的良好实践方法。至少要记录调用序列和返回值。
在应用程序中执行的方式非常直接,实际上会用无关的结构污染代码。
我决定使用一个宏来完成所有的脏活。现在看起来是这样的:
我看到了这段代码的问题。
因此,我正在寻找如何以最优雅的方式实现跟踪的好方法。
我的环境: 传统代码,C,Watcom 10.x,实时操作系统
在应用程序中执行的方式非常直接,实际上会用无关的结构污染代码。
int function (int param){
if(trace_level & LOG_FCALLS){
writelog("Entering function()");
}
/* something useful */
if(trace_level & LOG_FCALLS){
writelog("Exit from function()=%d", ret);
}
}
我决定使用一个宏来完成所有的脏活。现在看起来是这样的:
#define LOG_E(fn) const char *__fname=fn; printf("LOG: Entry to %s\n",__fname)
#define return(ret) printf("LOG: Exit from %s()=%d\n",__fname,ret)
int testFunc(){
LOG_E("testFunc");
/*do useful things */
return(ret);
}
我看到了这段代码的问题。
我重写了return语句,需要每次都写
return(ret)
而不是return ret
。很容易忘记这个问题。我在我的宏中定义了字符串变量。我知道C99中存在
__func__
宏,但我的编译器不支持此宏或任何其他相关的宏。如何记录函数参数的值?
因此,我正在寻找如何以最优雅的方式实现跟踪的好方法。
我的环境: 传统代码,C,Watcom 10.x,实时操作系统
return (ret)
被宏吃掉并转换为printf
,然后函数没有返回语句可以执行。你没有在宏中返回。 - ArjunShankar__FUNCTION__
宏。 - Matt#ifdef
测试了__func__
的存在:它不是一个宏,而是一个静态数组(就好像在函数开头声明了static const char __func__[] = "...";
)。 - mafso