所以我的C ++程序中有几个函数" dump"数据。在我开发应用程序时,这已经帮助我排除故障。数据被转储到大约十二个ascii文件中。
现在我希望这些函数不会转储任何数据,因此我可以看到程序运行的速度有多快,并且还有一个"最终版本"该计划。
我是否可以使用所有功能执行此类操作:
#define DO_DEBUG
#ifdef DO_DEBUG
void dump_dataA(...)
{
// lot of code
}
#else
void dump_dataA(...)
{
return;
}
#endif
我在思考这些问题,因为我无法返回并删除所有将数据转储到std :: out和ascii文件的行。这似乎不是一个好主意。特别是因为如果我以后必须升级这个程序,所有这些行都会对我有所帮助。那么关闭"关闭"的最佳方式是什么?转储调试数据的函数?
答案 0 :(得分:3)
您可以这样做,但会评估参数,并且实现应该是可见的(在标题中)。您可以使用预处理器:
#define DO_DEBUG
#ifdef DO_DEBUG
void dump_dataA_impl(/*args*/); // Implement it in cpp file or in header
# define dump_dataA(...) dump_dataA_impl(__VA_ARGS__)
#else
# define dump_dataA(...) /* Empty */
#endif
答案 1 :(得分:1)
if (...something...) { CallDebugFunction(); } doNormalStuff();
。将是一个简单的选择。 “something”可以是环境变量,配置文件,命令行参数或任何你喜欢的东西......
答案 2 :(得分:1)
将编译设置为Debug时,可以使用宏_DEBUG
defined by Visual studio,当编译类型为Relase时,不会定义它。
我还要更改函数内部的#if-#else-#endif
块,如下所示:
void dump_dataA(...)
{
#ifdef _DEBUG
cout << "data to log";
#endif /*_DEBUG*/
}
然后,一旦准备好在没有调试的情况下运行代码,只需将编译类型更改为 Release
以下是gcc
和Makefile
<强>生成文件:强>
APP=test
release: clean comp_rel run
debug: clean comp_dbg run
clean:
rm -rf ${APP}.exe
comp_dbg:
gcc -D _DEBUG ${APP}.c -o ${APP}.exe
comp_rel:
gcc ${APP}.c -o ${APP}.exe
run:
./${APP}.exe > ${APP}.log
<强> test.c的强>
#include <stdio.h>
int main()
{
size_t i;
while(i < 15)
{
i++;
#ifdef _DEBUG
printf("Value: %d\n",i);
#endif
}
return 0;
}
以调试模式编译:
make debug
这会将输出保存到test.log
在发布模式下编译:
make release
test.log