Visual C++ CRT debugging

Visual C++ CRT debugging

本文关键字:debugging CRT C++ Visual      更新时间:2023-10-16

你好,有人能向我解释一下使用define DEBUG、NDEBUG。。。并且可以为我提供一个例子。任何想法、想法、帮助、建议都将不胜感激。

那么:#define DEBUG#define NDEBUG

这些预处理器定义通常由编译器在调试构建中插入,供您使用。例如,您可能希望仅在调试构建时打印调试语句,而不希望在发布构建中包含它们。你可以通过使用预处理器来实现这一点:

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

printf语句将仅包含在调试生成中。

看看这个关于这两者之间差异的问题。

更多解释:在cpp文件真正编译之前,它被传递给一个名为预处理器的程序。它的任务是准备要编译的文件,例如,用适当的文件内容替换#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代表"如果未定义"。

现在,在您的调试构建中,您只需删除#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构建中不会做任何事情(将有空的正文),并且可以在Debug版本中进行日志记录。