1

プロジェクトに、構造体zが使用されているコードがいくつかあります。この構造体宣言は、システムに設定されている条件フラグに従って変更されます。構造体宣言を動的にしたい。

条件フラグが0の場合、

struct x z;

条件フラグが1の場合、

struct y z;

ただし、zで実行される操作は同じです。現在、これは両方の構造を宣言することによって処理されます。

struct x z_x;
struct y z_y;

次に、条件フラグに従って、コード内の適切な構造を使用します。この方法は最適ではないようです。このタイプのコードの処理に関する提案はありますか?

4

2 に答える 2

1

#ifdefsを使用して構造を作成することもできます。

typedef struct
{
#ifdef MY_FLAG
int s;
#else
float s;
#endif
} z;

ユニオンを使用することもできます。構造には両方のフィールドが同時に含まれ、必要なフィールドを使用します。

union {
int i;
float f;
} z;

zi = 1; zf = 1.0;

このように、一度に1つのメンバーのみを使用する必要があります。

于 2012-08-23T09:08:58.630 に答える
0

フラグは実行時であるため、このフラグを常にチェックすることは避けられません。少なくとも、そのようなことは考えられません。

ただし、メモリとコードを減らすことはできます。私はこのようにします:


メモリ使用量を減らすには:

struct z_x* = NULL;
struct z_y* = NULL;

//...

if( flag )
{
    z_x = malloc( sizeof( struct x ) );
}
else
{
    z_y = malloc( sizeof( struct y ) );
}

コードを減らすために、常に次のように書くのではなく、次のようにします。

if( flag )
{
    // do operations_N with z_x
}
else
{
    // do operations_N with z_y
}

私は書くだろう:

operations_N( z_x, z_y, flag );

どこ

void operations_N( struct x* z_x, struct y* z_y, flag )
{
    if( flag )
    {
        // do operations_N with z_x
    }
    else
    {
        // do operations_N with z_y
    }
}

もちろん、operations_1いくつflagかの適切で論理的な名前が必要です。

ただし、これによりいくつかの問題が発生する可能性があるため、このアプローチを使用する場合は注意が必要です。

于 2012-08-23T09:44:29.783 に答える