我的项目中有一些代码,其中使用了结构 z。此结构声明根据我的系统中设置的条件标志而更改。我希望结构声明是动态的。
如果条件标志为 0,则
struct x z;
如果条件标志为 1,则
struct y z;
但是要对 z 执行的操作是相同的。目前,这是通过声明两个结构来处理的:
struct x z_x;
struct y z_y;
然后根据条件标志在代码中使用适当的结构。这种方法似乎不是最优的。有关处理此类代码的任何建议?
我的项目中有一些代码,其中使用了结构 z。此结构声明根据我的系统中设置的条件标志而更改。我希望结构声明是动态的。
如果条件标志为 0,则
struct x z;
如果条件标志为 1,则
struct y z;
但是要对 z 执行的操作是相同的。目前,这是通过声明两个结构来处理的:
struct x z_x;
struct y z_y;
然后根据条件标志在代码中使用适当的结构。这种方法似乎不是最优的。有关处理此类代码的任何建议?
您还可以使用 #ifdefs 创建结构:
typedef struct
{
#ifdef MY_FLAG
int s;
#else
float s;
#endif
} z;
您也可以使用联合,该结构将同时具有两个字段,您将使用您需要的那个。
union {
int i;
float f;
} z;
zi = 1; zf = 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
应该有一些好的和合乎逻辑的名字。
但这可能会导致一些问题,所以如果您决定使用这种方法,请小心。