动态结构声明

时间:2012-08-23 09:02:57

标签: c

我的项目中有一些代码片段正在使用结构z。此结构声明根据在我的系统中设置的条件标志而更改。我希望结构声明是动态的。

如果条件标志为0,则

struct x z;

如果条件标志为1,则

struct y z;

但是在z上执行的操作将是相同的。目前,这是通过声明结构来处理的:

struct x z_x;
struct y z_y;

然后根据条件标志在代码中使用适当的结构。这种方法似乎不是最佳的。有关处理此类代码的任何建议吗?

2 个答案:

答案 0 :(得分:1)

您还可以使用#ifdefs创建结构:

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

你也可以使用union,结构将同时包含两个字段,你将使用你需要的字段。

union {
int i;
float f;
} z;

z.i = 1; z.f = 1.0;

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

答案 1 :(得分: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_1flag应该有一些好的和合乎逻辑的名称。

但这可能导致一些问题,所以如果你决定使用这种方法,请小心。