C 将#endif放在#if中
是否可以将#endif放在#if中作为块的“内容”而不是作为#if的配对#endif 如果这是不可能的,如何有条件地编译一个#如果#endif对 这就是我正在做的 我正在修改我们从另一家公司购买的代码库。为了方便地编译它,我使用了如下所示的宏C 将#endif放在#if中,c,c-preprocessor,C,C Preprocessor,是否可以将#endif放在#if中作为块的“内容”而不是作为#if的配对#endif 如果这是不可能的,如何有条件地编译一个#如果#endif对 这就是我正在做的 我正在修改我们从另一家公司购买的代码库。为了方便地编译它,我使用了如下所示的宏 #if (MY_COMPANY_EDITS_ENABLED) // My Modified code goes here #else // unmodified code from another company #endif 通过这种方式,我可以轻松地
#if (MY_COMPANY_EDITS_ENABLED)
// My Modified code goes here
#else
// unmodified code from another company
#endif
通过这种方式,我可以轻松地编译输入/输出修改,同时保持编辑的可读性。我到处都在使用相同的“如果”或“其他”endif块。但是后来我遇到了一个正在编译的代码,在原始未修改的代码库中,基于一些宏值
#if (FEATURE_A_IS_ENABLED)
// Line 1
// Line 2
#endif
但我想编译这段代码[第1行和第2行],而不管宏值功能是否启用
我的第一个想法是遵循到目前为止我一直使用的惯例[保持编辑的可读性]
#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
在这种情况下也是如此。这是不可能的,因为预处理器只对文件执行一次传递,并且
#endif
与前面的#if
匹配。如果要使#If
/#endif
块有条件,则只需将其嵌套在另一个#If
/#endif
块中:
#if CONDITION_A
# if CONDITION_B
...
# endif /* CONDITION_B */
#endif /* CONDITION_A */
换句话说,不可能让预处理指令构造其他预处理指令,因为初始“构造”阶段的输出不会被预处理器重新解析
例如,下面的(愚蠢的)示例也不起作用,即使假设换行符不会成为问题(它们会出现在这里):
我建议根据功能集进行更改,而不是根据功能集是否属于您进行更改,然后将它们组合在一起以生成给定版本(启用“我的公司”或“编辑”)或其他任何内容:
#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...
从长远来看,这更为灵活,可以通过重建打开和关闭更改功能。不,这是不可能的。第一个
#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)
当然,您可以嵌套预处理器指令:
#ifdef CONDITION1
// some code here
# ifdef CONDITION2
// some else here
# endif
#endif
但一定要正确地结束每种情况
另请参见:和这是什么意思?如果它结束了呢?很抱歉不清楚。我会更新这个问题。很抱歉说实话,这根本没有任何意义。@NeonGlow这根本不可能。预处理器如何知道哪个
#if
与哪个#endif
相匹配?!您可能可以使用好的旧布尔逻辑来解决它。@iharob:我知道这很荒谬,但只是出于好奇。这是不可能的,也不是因为预处理器。@iharob:请澄清。这是因为预处理器是如何工作的。你能用任何编程语言来完成吗?我的意思是有条件地结束if
块?假设你是编译器,你会怎么做?@iharob:在可以对输入进行多次传递的宏处理器中,这是可能的。我实际上还没有证实这一点,但我相信,例如,m2
可以make
不是一个宏处理器,但也可以选择使用$$
样式的扩展多次检查输入。噢!我明白你的意思。确切地说,这就是为什么不可能的原因,尽管你看到OP希望从缩进中得到什么。C语言和标准C预处理器都忽略了缩进。对我来说,缩进也不能解释OP的意图。另见C11:6.10.1 p4
#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)
#ifdef CONDITION1
// some code here
# ifdef CONDITION2
// some else here
# endif
#endif