1

コードのセクションを有効化および無効化するためのマクロ システムを備えたコード ベースを使用したことがあります。次のように見えました。

#define IN_USE      X
#define NOT_IN_USE  _

#if defined( WIN32 )
    #define FEATURE_A       IN_USE
    #define FEATURE_B       IN_USE
    #define FEATURE_C       NOT_IN_USE
#elif defined( OSX )
    #define FEATURE_A       NOT_IN_USE
    #define FEATURE_B       NOT_IN_USE
    #define FEATURE_C       IN_USE
#else
    #define FEATURE_A       NOT_IN_USE
    #define FEATURE_B       NOT_IN_USE
    #define FEATURE_C       NOT_IN_USE
#endif

次に、機能のコードは次のようになります。

void DoFeatures()
{
#if USING( FEATURE_A )
    // Feature A code...
#endif

#if USING( FEATURE_B )
    // Feature B code...
#endif

#if USING( FEATURE_C )
    // Feature C code...
#endif

#if USING( FEATURE_D ) // Compile error since FEATURE_D was never defined
    // Feature D code...
#endif
}

私の質問 (覚えていない部分) は、機能が「IN_USE」または「NOT_IN_USE」として定義されていない場合にエラーになるように、「USING」マクロを定義する方法です。これは、正しいヘッダー ファイルをインクルードするのを忘れた場合に発生する可能性があります。

#define USING( feature ) ((feature == IN_USE) ? 1 : ((feature == NOT_IN_USE) ? 0 : COMPILE_ERROR?))
4

6 に答える 6

1

以下の作品。FEATURE_D のコンパイル エラーが発生します。FEATURE_D のコードをコメントアウトすると、FEATURE_A と FEATURE_B のコードが実行されます。コードはほとんど一目瞭然です。FEATURE_D またはその他が DoFeatures 関数内で定義されているかどうかを確認する代わりに、それらを if ブロック内に配置できます。このようにして、コンパイラはコード ブロックを実行しようとします。1 の場合、if ブロック内のコードが実行されます。0 の場合は実行されません。定義されていない場合は、コンパイル エラーが発生します。

#include <stdio.h>

#define IN_USE      1
#define NOT_IN_USE  0

#define FEATURE_A       IN_USE
#define FEATURE_B       IN_USE
#define FEATURE_C       NOT_IN_USE


void DoFeatures()
{
    if(FEATURE_A){
        // Feature A code...
        printf("Feature A\n");
    }

    if(FEATURE_B){
        // Feature B code...
        printf("Feature B\n");
    }

    if(FEATURE_C){
        // Feature C code...
        printf("Feature C\n");
    }

    if(FEATURE_D) {// Compile error since FEATURE_D was never defined
        // Feature D code...
        printf("Feature D\n");
    }
}

int main(int argc, char **argv)
{
    DoFeatures();
    return 0;
}
于 2013-08-21T05:05:44.033 に答える
0

使用されていない場合は定義しないでください

#if defined( WIN32 )
    #define FEATURE_A       
    #define FEATURE_B       
#else if defined( OSX )
    #define FEATURE_C      
#else

#endif

次に、コードで:

void DoFeatures()
{
#ifdef FEATURE_A
    // Feature A code...
#endif

#ifdef FEATURE_B
    // Feature B code...
#endif

#ifdef FEATURE_C
    // Feature C code...
#endif

#ifdef FEATURE_D // Compile error since FEATURE_D was never defined
    // Feature D code...
#endif
}
于 2013-08-21T04:13:38.597 に答える
0

別の s のグループを使用できませんでした#ifdefか?

#if defined(WIN32)
    #define FEATURE_A
    #define FEATURE_B
#elif defined (OSX)
    #define FEATURE_C
#endif

// ...

#if defined(FEATURE_A)
    do_a();
#endif

于 2013-08-21T04:15:38.270 に答える