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;

这样,您一次只能使用一个成员。

于 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 回答