c语言 - 如何在生成文件构建中启用"#ifndef/#endif"块?



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

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

另外,为什么要使用#ifndef来灰显代码?它不应该是#ifdef NDEBUG吗?

您可以在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场景中执行某些操作。

#ifndef如果定义了标志,就不会省略代码,因此它的用法。您已经使用#undef成功地包含了代码。

#ifdef#ifndef都是有用的,作为理由考虑这个人为的例子:您有一堆调试printf代码,您希望使用#ifdef DEBUG条件将其编译到调试构建中。在同一个可执行文件中,您也有想要忽略调试构建的代码。在这种情况下,使用#ifndef DEBUG是您的唯一选择。

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

如果标志在源树中的某个地方定义的,那么这将没有帮助。

最新更新