Visual C ++ CRT调试

时间:2013-08-19 22:26:24

标签: c++ debugging

你好任何人都可以向我解释使用define DEBUG,NDEBUG ......的重点是什么,并且可以为我提供一个例子。 任何想法,帮助,建议表示赞赏。

所以有什么意义: #define DEBUG#define NDEBUG

1 个答案:

答案 0 :(得分:1)

这些预处理程序定义通常由编译器在调试版本中插入,供您使用。例如,您可能只想在调试版本中打印调试语句,而不是在发布版本中包含它们。您可以使用预处理器来实现:

 #ifdef _DEBUG
     printf("Debug statement here, or other piece of code");
 #endif

printf语句仅包含在调试版本中。

请参阅this question,了解这两者之间的差异。

更多解释:在cpp文件实际编译之前,它被传递给一个名为preprocessor的程序。它的任务是准备文件以进行编译,例如,用适当的文件内容替换#include指令,替换代码中的宏,等等。

预处理器能够做的事情之一是决定它是否会包含#if(def) #else #endif#块之间包含的代码块(请注意 - 这不是if/else C ++语句 - 这些是预处理程序指令。

比方说,你有一个程序有很多调试输出要做:

int foo()
{
    cout << "Before doing something" << endl;
    do_something();
    cout << "After doing something" << endl;
}

现在,您不希望这些打印出现在生产可执行文件中。首先,您可以手动评论所有这些行。第二种方法是您可以依靠预处理器自动为您执行此操作:

#define PRODUCTION_BUILD

int foo()
{
    #ifndef PRODUCTION_BUILD
        cout << "Before doing something" << endl;
    #endif

    do_something();

    #ifndef PRODUCTION_BUILD
        cout << "After doing something" << endl;
    #endif
}

注意: #ifndef代表“if not defined”。

现在,在您的调试版本中,您可以删除#define PRODUCTION_BUILD,并将相应的行包含在将传递给编译器的文件中。在生产构建中,您只需要保留此定义,并且couts将不会包含在最终的exe中。

现在,编译器可以生成一堆预定义符号。一个可能是您的Windows版本,如果您使用调试符号编译代码(调试与发行版本),可能就是一个。此符号的名称为_DEBUG(或NDEBUG,请参阅我离开的链接)。

现在你的代码可能很简单:

int foo()
{
    #ifdef _DEBUG
        cout << "Before doing something" << endl;
    #endif

    do_something();

    #ifdef _DEBUG
        cout << "After doing something" << endl;
    #endif
}

注意:我们现在使用#ifdef而不是#ifndef

现在你的couts将自动包含在Debug版本中(我们自己不需要#define个符号)。

注意:这仅用于演示目的。你不想把#ifdefs放在每几行,但你可能想要,例如提供一个在Release版本中不会做任何事情的函数(将有空体),它可以做登录调试版。