【问题标题】:How do you enable "#ifndef/#endif" blocks in makefile builds?如何在 makefile 构建中启用“#ifndef/#endif”块?
【发布时间】:2012-07-19 02:05:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: c makefile mupdf ifndef


    【解决方案1】:

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

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

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

    如果标志 被定义在源代码树的某个地方,那么这将无济于事。

    【讨论】:

    • 感谢您告诉我有关 -U 标志的信息
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多