如何在makefile构建中启用“#ifndef /#endif”块?

时间:2012-07-19 20:06:39

标签: c makefile mupdf ifndef

我正在尝试在MuPDF中启用调试选项。出于某种原因,他们使用了#ifndef NDEBUG#endif来删除我想要使用的代码。我在整个图书馆搜索,但找不到任何地方定义的任何NDEBUG痕迹。我设法通过在标题中添加#undef NDEBUG来解决这个问题,但我想知道是否存在更多非侵入性的方法。

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

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

2 个答案:

答案 0 :(得分:9)

您可以将 -DNDEBUG 添加到Makefile中的以下3个变量 - CFLAGS CPPFLAGS CXXFLAGS 定义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场景中做了些什么。

答案 1 :(得分:3)

如果定义了标志,

#ifndef 将不会省略代码,因此它的用法。您已设法使用#undef包含代码。

#ifdef#ifndef都很有用,因为理由考虑了这个人为的例子:你有一堆只有 想要编译的调试printf代码使用#ifdef DEBUG条件进入Debug构建。在同一个可执行文件中,您还可以使用忽略调试版本的代码。在这种情况下,使用#ifndef DEBUG是您唯一的选择。

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

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