Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在调试模式下工作_C++ - Fatal编程技术网

C++ 在调试模式下工作

C++ 在调试模式下工作,c++,C++,当我使用这样的语句时: #ifdef _DEBUG cout << "Output that should only be used in Debugging Mode." << endl; #endif \ifdef\u调试 cout我不认为“调试模式”是指您认为它的功能\u调试通常在编译调试版本时定义。编译后,无法进入和退出“调试模式”。您可以在发布后编译并覆盖可执行文件,但该二进制文件将成为发布版本,然后您将无法进入“调试模式” 这与你是否使用调试器连接到应用程

当我使用这样的语句时:

#ifdef _DEBUG
cout << "Output that should only be used in Debugging Mode." << endl;
#endif 
\ifdef\u调试
cout我不认为“调试模式”是指您认为它的功能<代码>\u调试
通常在编译调试版本时定义。编译后,无法进入和退出“调试模式”。您可以在发布后编译并覆盖可执行文件,但该二进制文件将成为发布版本,然后您将无法进入“调试模式”

这与你是否使用调试器连接到应用程序无关,也与你的心态是“调试”还是“只是运行”无关。编译之后,您可以假设
\u DEBUG
是永久定义的(如果您在调试模式下编译),或者不定义(否则),直到重新编译为止。我不认为“调试模式”是指您认为它所做的<代码>\u调试通常在编译调试版本时定义。编译后,无法进入和退出“调试模式”。您可以在发布后编译并覆盖可执行文件,但该二进制文件将成为发布版本,然后您将无法进入“调试模式”

这与你是否使用调试器连接到应用程序无关,也与你的心态是“调试”还是“只是运行”无关。编译后,您可以假定
\u DEBUG
是永久定义的(如果您在调试模式下编译),或者不定义(否则),直到重新编译为止。

\ifdef\u DEBUG
是编译时(实际上是预处理时)构造,它与您是否在调试器中执行程序无关,但事实上,
\u DEBUG
宏已经定义

通常,您至少有两组构建选项,一组用于调试(定义
\u debug
,禁用多个编译器优化并生成调试符号),另一组用于发布(它不定义
\u DEBUG
,启用所有相关的编译器优化,并且可能不会生成调试信息,或者在单独的文件中生成它们)

在开发程序时,您通常会使用调试配置,在构建最终部署/实际应用于日常使用的可执行文件时,您会使用发布配置,其中不包括
\ifdef\u debug…#endif
块中包含的代码。一旦在其中一个配置中生成了可执行文件就这样,编译时定义的
\u DEBUG
在可执行文件中是“一成不变的”

也就是说,有一些特定于平台的方法可以检测是否连接了调试器,但通常最好不要弄乱这些东西——根据是否连接了调试器来改变程序行为可能会破坏使用调试器的目的


补遗
好的,让我看看我是否完全理解。如果我点击f5来运行调试构建,那么这个#ifdef(ifdef)调试中的任何内容都会被执行,当我点击ctrl+f5以发布模式运行它时,它不会运行它为我所做的#ifdef(ifdef)调试中的代码。我认为我不完全理解你想说的内容。你能试着解释一下吗如果可以的话,请说明。我在C++和VisualStudio环境中不是那么先进。 在我看来,在C++中构建/调试过程是如何发生的一些误解。当你点击F5时,发生的是:

  • 调用编译器;它根据当前选定配置的生成设置编译文件并生成可执行文件;1
  • 运行可执行文件
  • VS调试器附加到新创建的process2
  • 当您按Ctrl+F5时,唯一的区别是跳过了步骤3;其余步骤完全相同

    现在,什么时候开始执行
    \u DEBUG
    ?在步骤1,生成可执行文件(实际上,在步骤1的早期,在预处理阶段);无论是否附加了调试器,都没有区别-放入
    \ifdef\u DEBUG
    块中的指令已经从可执行文件中写入(或排除)

    这里的关键点是,F5/Ctrl+F5和Debug/Release配置是两种正交设置;您可以构建一个“Debug”可执行文件并在不进行调试的情况下启动它,也可以构建一个“Release”可执行文件并在调试的情况下启动它(实际上,这通常用于调试仅在优化构建中出现的问题).调试器附加到程序的事实不应该改变它的行为

    同样,使用/不使用调试器与是否希望在此运行中附加调试器有关,内置调试/发布配置与实际构建可执行文件的方式有关(调试配置是一组更“调试友好”的配置)设置-
    \u DEBUG
    定义为启用调试代码、
    启用断言、禁用优化、启用调试符号……)


    注释

  • 如果以前的构建中有一些可重用的输出,则跳过或缩短此步骤-例如,如果源代码没有更改上一个构建中的可执行文件,并且保留了当前配置
  • 实际上,该进程是在附加了调试器的情况下创建的;这可能会导致一些微妙的问题,但在这里并不相关
  • 实际上,在某些情况下,调试器确实会改变其行为,因为进程可以使用
    IsDebuggerPresent
    检查调试器,但通常由于上述原因,您不希望这样做
  • \ifdef\u DEBUG
    是一个编译时(实际上是预处理时)构造,它与您是否在调试器中执行程序无关,而是与
    \u DEBUG