4

我正在尝试在 MuPDF 中启用调试选项。出于某种原因,他们使用了我想使用的代码#ifndef NDEBUG并将其灰显。#endif我搜索了整个库,但找不到任何地方定义的 NDEBUG 痕迹。我已经设法通过添加标题来解决这个#undef NDEBUG问题,但我想知道是否有更非侵入性的方法可以做到这一点。

那么,你能从makefile中启用“#ifndef/#endif”块吗?

另外,你为什么要用#ifndef灰色的代码?不应该是#ifdef NDEBUG吗?

4

2 回答 2

10

您可以在Makefile 中将-DNDEBUG添加到以下 3 个变量 - CFLAGSCPPFLAGSCXXFLAGS以定义 NDEBUG。这相当于添加#define NDEBUG

还有其他变化:

-DNBDEBUG=1

相当于

#define NDEBUG 1

并且回答为什么有人会使用 #ifndef 而不是 #ifdef 的问题是因为它非常清楚地突出了您对原始代码的修改。

例如,将以下代码视为原始版本:

int a = 123;
int b = 346;
int c = a + b;

你需要添加一个宏 DO_MULT 来代替 - 有两种方法可以做到这一点。

第一个变体:

int a = 123;
int b = 346;
#ifdef DO_MULT
int c = a *b;
#else
int c = a + b;
#endif

第二种变体:

int a = 123;
int b = 346;
#ifndef DO_MULT
int c = a + b;
#else
int c = a *b;
#endif

如果您使用 difftools 查看更改 - 与第一个变体相比,第二个变体将更清楚地显示差异。

使用 #ifndef 的另一个原因是在 CATCH-ALL-EXCEPT 场景中执行某些操作。

于 2012-07-19T20:08:33.607 回答
3

#ifndef 如果定义了标志,则不会省略代码,因此它是用法。您已经设法使用#undef.

两者#ifdef#ifndef都是有用的,作为理由考虑这个人为的例子:你有一堆调试printf代码,你只想使用#ifdef DEBUG条件编译成一个调试版本。在同一个可执行文件中,您还具有要从 Debug 构建中删除的代码。在这种情况下,使用#ifndef DEBUG是您唯一的选择。

可以在 makefile 中定义此类标志,也可以尝试使用-U. 在 makefile 中查找CFLAGS变量并添加-UNDEBUG,或者直接将其添加到编译目标中的编译器调用中。

如果标志在源树中的某处定义的,那么这将无济于事。

于 2012-07-19T20:08:59.520 回答