簡體   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