我的项目中有一些代码片段正在使用结构z。此结构声明根据在我的系统中设置的条件标志而更改。我希望结构声明是动态的。
如果条件标志为0,则
struct x z;
如果条件标志为1,则
struct y z;
但是在z上执行的操作将是相同的。目前,这是通过声明结构来处理的:
struct x z_x;
struct y z_y;
然后根据条件标志在代码中使用适当的结构。这种方法似乎不是最佳的。有关处理此类代码的任何建议吗?
答案 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_1
和flag
应该有一些好的和合乎逻辑的名称。
但这可能导致一些问题,所以如果你决定使用这种方法,请小心。