如何关闭用于在程序中打印调试数据的函数

时间:2017-07-25 20:56:45

标签: c++ visual-studio

所以我的C ++程序中有几个函数" dump"数据。在我开发应用程序时,这已经帮助我排除故障。数据被转储到大约十二个ascii文件中。

现在我希望这些函数不会转储任何数据,因此我可以看到程序运行的速度有多快,并且还有一个"最终版本"该计划。

我是否可以使用所有功能执行此类操作:

#define DO_DEBUG
#ifdef DO_DEBUG
void dump_dataA(...)
{
    // lot of code
}
#else
void dump_dataA(...)
{
    return;
}
#endif

我在思考这些问题,因为我无法返回并删除所有将数据转储到std :: out和ascii文件的行。这似乎不是一个好主意。特别是因为如果我以后必须升级这个程序,所有这些行都会对我有所帮助。那么关闭"关闭"的最佳方式是什么?转储调试数据的函数?

3 个答案:

答案 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

以下是gccMakefile

的工作示例

<强>生成文件:

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

中没有存储输出