我有 Win32 DLL 应用程序。选择调试版本。我写了这样的代码:
#if DEBUG
fflush(logFile);
#endif
但是fflush(logFile);
是灰色的,所以我认为它不会被执行。但我希望它被执行。这是否意味着在 DebugDEBUG
中未定义符号?在VS2012中哪里可以定义?
我有 Win32 DLL 应用程序。选择调试版本。我写了这样的代码:
#if DEBUG
fflush(logFile);
#endif
但是fflush(logFile);
是灰色的,所以我认为它不会被执行。但我希望它被执行。这是否意味着在 DebugDEBUG
中未定义符号?在VS2012中哪里可以定义?
预处理器定义在项目设置下定义,如屏幕截图所示(注意_DEBUG
那里):
请注意,如果_DEBUG
您想检查它是否已定义,而不是将其(可能缺少定义)与零进行比较。你要:
#if defined(_DEBUG)
或者
#ifdef _DEBUG
默认情况下,Visual Studio C++ 项目将为_DEBUG
调试项目配置定义宏。它将具有值1
,因此您可以使用#if
or对其进行测试#ifdef
。
但请注意,宏以下划线开头 - 如果您想使用名称DEBUG
(也许您有使用该名称的现有代码),您需要自己将其添加到项目属性中(C/C++ | Preprocessor | Preprocessor definitions
)。或者,您可以将以下内容放在每个翻译单元(可能)中包含的标题中stdafx.h
:
#if _DEBUG
#undef DEBUG
#define DEBUG 1
#endif
每个项目都有两个版本:调试和发布。调试构建已DEBUG
定义,就像您使用以下定义一样:
#define DEBUG
它使代码能够以不同的方式生成。代码(函数、类等)的编写者可能会添加额外的诊断来帮助调试。Debug 版本仅用于调试,您不要将此版本(即使用 Debug 版本生成的 EXE)提供给客户。
另一个DEBUG
未定义符号的构建是用于发布构建。发布版本适用于代码级别、编译器设置级别和链接器级别的优化代码。大多数诊断、断言、调试辅助功能将被禁用 - 以生成优化的可执行文件。
不管谁写了上面的代码,脑子里都写了同样的东西。只有在调试构建正在运行时才能刷新文件。您可以注释#if
and #endif
,并让fflush
行编译,或者您可以使用 Release build。这一切都取决于你。