Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将#endif放在#if中_C_C Preprocessor - Fatal编程技术网

C 将#endif放在#if中

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 通过这种方式,我可以轻松地

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

如果这是不可能的,如何有条件地编译一个#如果#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