是否可以将#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
在这种情况下也是如此。
答案 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_vanschnitz和http://www.ioccc.org/years.html#2004_vik2