Visual C++ CRT debugging
Visual C++ CRT debugging
你好,有人能向我解释一下使用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版本中进行日志记录。
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- 如何在 SEAL 3.1 中使用 CRT 批处理技术Microsoft?
- VS2019 - Sudo Remote Debugging on Linux with Cmake project
- sf::Windows上的音乐:api-ms-win-crt-locale-l1-1-0.dll:无法打开共享对象文件
- 阻止我的项目调用__CxxFrameHandler3(CRT函数)
- CRT 不打印内存泄漏的行号
- JNI c++ Netbeans Debugging
- 在 C++/CLI/C# 项目中启用"Native Code Debugging"导致应用程序崩溃
- CRT 检测到应用程序在堆缓冲区(新建/删除)类结束后写入内存
- Debugging ofstream.(C++)
- 使用 CRT 库 - _CrtDumpMemoryLeaks() 问题的托管C++C++内存泄漏
- 如何在没有CRT的情况下链接OBJ文件
- 编译 C++ dll Visual Studio 与 crt 库的链接错误
- 静态或动态链接到容器中运行的二进制文件的 C 运行时 (CRT)
- 如何防止C或C 程序使用CRT功能
- 为什么"Start Debugging"比VC2010中的"attach to process"慢得多?
- Visual C++ CRT debugging
- Visual C++ CRT debugging