c++ - Visual C++ CRT调试

标签 c++ debugging

你好,谁能向我解释一下使用 define DEBUG、NDEBUG 的意义是什么,并且可以给我提供一个例子。 任何想法,帮助,建议表示赞赏。

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

最佳答案

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

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

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

参见 this question关于这两者之间的区别。

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

预处理器能够做的一件事是决定它是否包含包裹在 #if(def) #else #endif# block 之间的代码块(请注意 - 这不是 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,但是你可能想要,例如提供一个函数,它不会在发布版本中做任何事情(将有空体),它可以在调试版本中进行登录。

关于c++ - Visual C++ CRT调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18324113/

相关文章:

perl - 如何在调试时恢复全局变量 $1、$2、$3?

C++ for 循环 : 'i' was not declared in this scope

c++ - android ndk 和 cygwin

c++ - 使用 AVX 逐项添加两个双数组

c++ - 摆脱带符号的零

java - 有人可以解释为什么会出现这样的结果吗?

debugging - 有没有办法跳过 Bochs 调试命令行?

c++ - 被间接乘法算法困扰

c++ - 如何在 C++ 中为堆栈集声明 Iterator

python - undefined variable ?