1

我有 Win32 DLL 应用程序。选择调试版本。我写了这样的代码:

#if DEBUG
fflush(logFile);
#endif

但是fflush(logFile);是灰色的,所以我认为它不会被执行。但我希望它被执行。这是否意味着在 DebugDEBUG中未定义符号?在VS2012中哪里可以定义?

4

3 回答 3

3

预处理器定义在项目设置下定义,如屏幕截图所示(注意_DEBUG那里):

在此处输入图像描述

请注意,如果_DEBUG您想检查它是否已定义,而不是将其(可能缺少定义)与零进行比较。你要:

#if defined(_DEBUG)

或者

#ifdef _DEBUG

于 2012-11-28T08:22:05.373 回答
2

默认情况下,Visual Studio C++ 项目将为_DEBUG调试项目配置定义宏。它将具有值1,因此您可以使用#ifor对其进行测试#ifdef

但请注意,宏以下划线开头 - 如果您想使用名称DEBUG(也许您有使用该名称的现有代码),您需要自己将其添加到项目属性中(C/C++ | Preprocessor | Preprocessor definitions)。或者,您可以将以下内容放在每个翻译单元(可能)中包含的标题中stdafx.h

#if _DEBUG
#undef DEBUG
#define DEBUG 1
#endif
于 2012-11-28T08:46:30.010 回答
0

每个项目都有两个版本:调试和发布。调试构建已DEBUG定义,就像您使用以下定义一样:

#define DEBUG

它使代码能够以不同的方式生成。代码(函数、类等)的编写者可能会添加额外的诊断来帮助调试。Debug 版本仅用于调试,您不要将此版本(即使用 Debug 版本生成的 EXE)提供给客户。

另一个DEBUG未定义符号的构建是用于发布构建。发布版本适用于代码级别、编译器设置级别和链接器级别的优化代码。大多数诊断、断言、调试辅助功能将被禁用 - 以生成优化的可执行文件。

不管谁写了上面的代码,脑子里都写了同样的东西。只有在调试构建正在运行时才能刷新文件。您可以注释#ifand #endif,并让fflush行编译,或者您可以使用 Release build。这一切都取决于你。

于 2012-11-28T08:03:47.417 回答