2010-09-27 91 views
0

我必须为现有方法定义一组新的包装。 这些新的包装打算通过包含某些跟踪信息来帮助调试。方法调用的链接

原始源代码:

sample.c文件::

Caller{ 

void functionA(){ 
    funcB(); 
} 

} 

Callee{ 

void funcB(){ 
} 
} 

修改代码与传统的包装功能:

Sample.h ::

#define funcB wrapperFuncB //not visible to Callee 

Caller{ 

void functionA(){ //this gets redirected to wrapperFuncB cos of #define 
    funcB(); 
} 
} 
Callee{ 

void wrapperFuncB(){ 
    if(DEBUG){ //value of DEBUG is set at runtime 
     //COLLECT Trace data 


    }else{ 
     funcB(); 
    } 
} 
void funcB(){ 
} 
} 

这种机制有额外的开销: 1]所有对funcB的调用都是ro贡献于wrapperFuncB,DEBUG的irrespecitve启用与否 2]另一种方法帧[wrapperFuncB]已被创建,DEBUG的irrespecitve启用与否 3]条件检查的开销

+2

对你有好处。你有问题吗 ? – ereOn 2010-09-27 10:32:48

+0

这看起来不像C. Tag被移除。 – pmg 2010-09-27 10:36:45

回答

1

如果方法是相同的,你可以使用这样的事情:

#ifdef __DEBUGING 
#define myClass debug_class 
#else 
#define myClass actual_class 
#endif 

通过这种方式,您可以有选择性地选择你正在使用的类在代码中,实际的一个或包装之一。可能有一些问题,因为这只是想到的第一个想法。

1

或者你可以把你的调试语句这样

#ifdef DEBUG_ENABLE 
DEBUG_LOG(X) printf(x) 
#else 
DEBUG_LOG(X) do{}while(0) 

void FunctionA() 
{ 
DEBUG_LOG("\n Debugging function",__func__); 
} 

您可以使用相同的程序没有包装。优点是日志会使代码更容易理解,您可以使用编译器选项来启用和禁用它们。

+0

您应该为#ifdef情况以及#else使用do/while块。当C标签仍然存在问题时,你可能已经做出了回应,使用printf()这么足够公平,但使用一个字符串arg很难使用。在C++中,可以使用'std :: cerr << __FILE__ <<':'<< __LINE <<''<< X <<'\ n';'或类似的,然后DEBUG_LOG(“x”<< x) ;等等 – 2010-09-27 10:53:23

+0

但是这里的问题是“DEBUG_ENABLE”在运行时被设置,在实际的程序执行期间。在编译时,我们不知道程序是否会在调试模式下执行。 – user170008 2010-09-28 06:58:40

+0

在这种情况下,您将知道是否设置了debug_enable,宏可以具有条件if(debug_enable)语句并执行该操作。这避免了使用包装函数。 – 2010-09-28 07:29:24

0

由于函数wrapperFuncB将具有与funcB相同的签名,因此您可以简单地在不需要新类的情况下执行此操作。

#ifdef __DEBUG__ 
#define funcB wrapperFuncB 
#else 
#define funcB actualFuncB 
#end 

所以当你不进行调试或收集跟踪信息,你可以简单地通过不定义DEBUG将其关闭,不会有任何开销

编辑:正从user170008的意见后,已更新

我不认为#ifdef __DEBUG__种类的东西可以在运行时使用。很可能你必须依靠命令行参数区分调试或正常运行。 但是什么都这样,你使用只需创建一个函数指针,并根据设置什么样的运行你在这之后e.g

void (*funcB)(void); 
if(debug) 
    funcB=debugFuncB; 
else 
    funcB=actualFuncB; 

做你正在使用现在即funcB(),你可以简单地使用funcB;

+0

但是这里的问题是“__DEBUG__”在运行时,在实际的程序执行期间被设置。在编译时,我们不知道程序是否会在调试模式下执行。 – user170008 2010-09-28 07:22:51

+0

然后我想你可以使用函数指针。我将添加到我的答案 – binW 2010-09-28 13:48:58