将#endif放在#if中

时间:2015-04-08 10:38:43

标签: c c-preprocessor

是否可以将#endif作为块的'内容'放在#if中,而不是#if的#endif对

#if (SOME_CONDITION)
    #if (ANOTHER_CONDITION)
#endif // pair endif for #if (SOME_CONDITION)


#if (SOME_CONDITION)
    #endif // pair endif for #if (ANOTHER_CONDITION)
#endif // pair endif for #if (SOME_CONDITION)

如果不可能如何有条件地编译#if ... #endif对?

这就是我在做的事。

我正在修改我们从其他公司购买的代码库。为了使用和不使用我的修改来编译它我很容易使用如下所示的宏。

#if (MY_COMPANY_EDITS_ENABLED)
// My Modified code goes here
#else
// unmodified code from another company
#endif

通过这种方式,我可以轻松编译/修改我的修改,同时保持对我的编辑的可读性。我到处都使用相同的#if #else #endif块。但后来我发现了一个代码,它是在原始的未经修改的代码库中基于某些宏值编译的。

#if (FEATURE_A_IS_ENABLED)
// Line 1
// Line 2
#endif

但是我想编译这段代码[第1行和第2行]而不管宏值FEATURE_A_IS_ENABLED

我的第一个想法是遵循我迄今为止使用的相同约定[以保持对我的编辑的可读性]。

#if (MY_COMPANY_EDITS_ENABLED)
//#if (FEATURE_A_IS_ENABLED)
#else
#if (FEATURE_A_IS_ENABLED)
#endif

// Line 1
// Line 2

#if (MY_COMPANY_EDITS_ENABLED)
// #endif
#else
#endif
#endif

然后我意识到这是不可能的。

我知道,存在实现相同的替代方法。但是想知道我是否可以使用相同的约定

#if (MY_COMPANY_EDITS_ENABLED)
// My Modified code goes here
#else
// unmodified code from another company
#endif

在这种情况下也是如此。

4 个答案:

答案 0 :(得分:1)

这是不可能的,因为预处理器只对您的文件进行一次传递,#endif与前面的#if匹配。如果您想使#if / #endif块有条件,请将其嵌套在另一个#if / #endif块中:

#if CONDITION_A
#  if CONDITION_B
...
#  endif /* CONDITION_B */
#endif /* CONDITION_A */

换句话说,不可能让预处理指令构造其他预处理指令,作为初始"构造的输出"预处理器不会重新分析阶段。

下面的(愚蠢)示例不会起作用,例如,即使假设换行不是问题(他们会在这里):

#if DEFINE_X_TO_FIVE
#define X
#endif
#if DEFINE_X_TO_FIVE
5
#endif

答案 1 :(得分:1)

不,这是不可能的。第一个#endif将与最新的#if#else匹配,因此您的代码将被解释为:

#if (SOME_CONDITION)
    #if (ANOTHER_CONDITION)
    #endif // pair endif for #if (ANOTHER_CONDITION)


    #if (SOME_CONDITION)
    #endif // pair endif for the second #if (SOME_CONDITION)
#endif // pair endif for the first #if (SOME_CONDITION)

答案 2 :(得分:0)

我建议根据功能集进行更改,而不是是否属于您的更改,然后将它们组合在一起制作给定版本(MY_COMPANY_EDITS_ENABLED)或其他:

#if (MY_COMPANY_EDITS_ENABLED)
     #define FEATUREA
     #define FEATUREB
     #define FEATUREC
     #define FEATURED
#else
     #define FEATUREA
     #undef  FEATUREB
     #undef  FEATUREC
     #undef  FEATURED
#endif

#ifdef FEATUREA
//do some feature A stuff
#endif

// do code

#ifdef FEATUREB
//do some feature B stuff
#endif

#ifndef FEATUREC
//do some stuff if not feature C
#endif

// etc...

从长远来看,这种方式更加灵活,您可以通过重建来打开和关闭更改功能。

答案 3 :(得分:-2)

当然,您可以嵌套预处理程序指令:

#ifdef CONDITION1
// some code here
      # ifdef CONDITION2
      // some else here
      # endif
#endif

但请确保正确结束每个条件。

另请参阅:http://www.ioccc.org/years.html#1995_vanschnitzhttp://www.ioccc.org/years.html#2004_vik2