0

您好,任何人都可以向我解释使用define DEBUG,NDEBUG 的意义......并且可以为我提供一个示例。任何想法,帮助,建议表示赞赏。

那么有什么意义: #define DEBUG#define NDEBUG

4

1 回答 1

1

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

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

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

请参阅有关两者之间差异的问题。

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

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

假设,例如,你有一个程序有很多调试输出要做:

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 版本中进行日志记录。

于 2013-08-19T22:36:10.447 回答