是否有可能模拟将#ifdef置于另一个#ifdef #endif中的效果?

时间:2015-08-07 08:20:20

标签: c++ syntax macros

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

#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”只需要出现一次?

5 个答案:

答案 0 :(得分:4)

你的问题是:

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

#endif

你有#ifdefs,elses和endifs的错误数量。

做你要求的事情:

#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

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

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

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

答案 1 :(得分:1)

是的,您可以使用defined运算符(如果定义了标识符,则评估为1,否则评估为0)。如果定义了SOME SETTING 1A,或者两者都未定义,则基本上似乎想要B,否则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)都是零或者两者都是零 - 而且一个零是他们唯一的选择。

请注意,如果您想将此扩展为两个以上的替代方案,则必须谨慎使用#elif,因为如果您重复SOME SETTINGS 1 #if #endif可能会改变后续测试}} - 这就是为什么我们需要#else用于SOME SETTINGS 2部分的原因。例如:

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

答案 2 :(得分:0)

您可以将检查结合起来进行此类定义。

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

答案 3 :(得分:0)

当A& A&定义B,或者定义A或B。这应该可以解决问题:

#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

答案 4 :(得分:0)

这个怎么样:

#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