繁体   English   中英

是否可以模拟将#ifdef放置在另一个#ifdef #endif中的效果?

[英]Is it possible to simulate the effect that place #ifdef inside another #ifdef #endif?

我正在检查一些导入语句,发现某些导入语句的格式如下:

#ifdef A

#ifdef B
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif

#else

#ifndef B
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif

#endif

其中A的宏与B的宏相反,但是“ // SOME SETTINGS 1”和“ // SOME SETTINGS 2”需要出现两次,所以我尝试重写一下:

#ifdef A
#ifdef B
#else
#ifndef B
#endif

//SOME SETTINGS 1 (some include,define,ifdef...)

#else

//SOME SETTINGS 2 (some include,define,ifdef...)

#endif

但是它无法编译,是否有任何语法可以模拟这种情况,即“ // SOME SETTINGS 1”和“ // SOME SETTINGS 2”只需要出现一次?

您的问题是这样的:

#ifdef A
  #ifdef B
  #else
   #ifndef B
   #endif
           //SOME SETTINGS 1 (some include,define,ifdef...)
#else
          //SOME SETTINGS 2 (some include,define,ifdef...)

#endif

您的#ifdef,else和endif数量错误。

要执行您要求的操作:

#if (defined(A) && defined(B)) || (!defined(A) && !defined(B))
  // settings 1
#else
  // settings 2
#endif

这就是您通常解决这类问题的方式。 您设置了一个卡诺表真值表:

A    B   => 1
A   !B   => 2
!A   B   => 2
!A  !B   => 1

仔细阅读此表意味着您需要使用设置1来定义(A和B)或何时(未定义A且未定义B)...因此在C中:

(A && B) || (!A && !B)

将其转换为ifdef语法,就可以了。

是的,您可以使用defined运算符(如果定义了标识符,则计算为1 ,否则为0 )。 如果AB都已定义或未定义,则似乎基本上需要SOME SETTING 1 ,否则,则需要SOME SETTINGS 2

#if defined(A) == defined(B)
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif

直接的比较是因为您想使defined(A)defined(B)都为1或都为零-并且一和零是它们的唯一替代方案。

请注意,如果您要将其扩展到两个以上的选择,则必须小心使用#elif因为如果重复#if #endif组, SOME SETTINGS 1会更改后续测试-这就是为什么我们需要对#else使用#else SOME SETTINGS 2部分。 例如:

#if COND1(A,B):
     // SOME SETTINGS 1
#elif COND2(A,B):
     // SOME SETTINGS 2
// etc
#else
     // DEFAULT SETTINGS
#endif

您可以像这样组合检查定义。

#if (defined(A) && defined(B)) || (!defined(A) && !defined(B))
// SOME SETTINGS 1
#else
// SOME SETTINGS 2
#endif

您需要在定义A和B或同时定义A或B时设置1。 这应该可以解决问题:

#if (defined (A) && defined(B)) || (!defined (A) && !defined(B))
    //SOME SETTINGS 1 (some include,define,ifdef...)
#else
    //SOME SETTINGS 2 (some include,define,ifdef...)
#endif

那这个呢:

#if (defined A && defined B) || (!defined A && !defined B)
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM