我想创建一个类似下面的宏,它将用于创建两个函数:一个启用调试,另一个启用调试。
#define MakeDebuggerFunction(funName, funContents)\
void funName() funContents\
#define DEBUGGING\
void funName ## _debugging() funContents\
#undef DEBUGGING
使用它的方式如下:
MakeDebuggerFunction(DoWork,
{
std::cout << "Doing Work" << std::endl;
#ifdef DEBUGGING
std::cout << "Printing Verbose" << std::endl;
#endif
}
)
这将产生两个功能:DoWork和DoWork_debugging。两个函数都具有相同的准确性&#34; guts&#34;该函数的代码,但调试函数也会添加一些详细的打印。
我想要创建两个函数的原因是因为我的GUI应用程序具有&#34;开发人员模式&#34;当我不在办公室和现场与客户一起工作时,我可以使用这些服务,在那里我没有真正的调试环境。
这些函数中的许多函数处理强度也很高,所以我想避免像添加一个包含我的详细代码的永久if(DeveloperMode) {}
语句那样做。
我将非常感谢我能得到的任何帮助/建议。
答案 0 :(得分:1)
我认为这就是@Justin的建议
我会像这样制作我的包装函数:
void DoWork_Wrapper()
{
if (DeveloperMode)
DoWork(..., true);
else
DoWork(...., false);
}
并且worker函数将是:
void DoWork(..., bool DeveloperMode)
{
/// do some stuff
if (DeveloperMode)
/// print verbose
}
所以当我调用DoWork(..., false)
时,编译器已经优化了if语句?
答案 1 :(得分:0)
这样做怎么样?您可以使您的调试功能内联,它将完全透明。当然,您必须解决更复杂的调试消息并适当调整调试功能。这比复制你的功能要好得多。
void debug(string s) {
if (DeveloperMode) {
std::cout << s << "\n";
}
}
std::cout << "Doing Work" << std::endl;
debug("Printing Verbose");
或者你可以使用其中一个looging库。例如。 Log4c。
答案 2 :(得分:0)
我不确定这是否正是您想要的,但是如果您可以编译一个版本并启用调试,而另一个版本没有您只需将一个DEBUGGING编译标志添加到调试版本并执行以下操作
#ifdef DEBUGGING
#define debugPrint(verboseMessage) \
std::cout << verboseMessage << std::endl;
#else
#define debugPrint(verboseMessage)
#endif
这将使你可以随时调用这个宏,如果打开调试它会实际打印你的消息,否则什么都不会发生。
HTH!