如何根据条件使用不同的数据类型变量?

时间:2016-07-21 06:22:24

标签: c types c-preprocessor

我有以下两个结构

typedef struct {

int day;

char action [10];

}DataType1;

typedef struct {

int day;

char action [50];

}DataType2;

现在我必须根据某些条件只使用一种结构数据类型。我做过类似的事情

void *ptr;
DataType1 var1;
DataType2 var2;

if (validCondition  == true)
{
    ptr = &var1;
}
else
{
   ptr = &var2;
}
//Used ptr in remaining code

但是使用这个代码我填写可能是我的代码中有一些设计飞行,这就是为什么我需要这种类型的技巧,但无论如何我需要它。我也想到了一些不同的方式,但我怀疑它是如何运作的

if (validCondition  == true)
{
    #define GENERIC_TYPE DataType1;
}
else
{
   #define GENERIC_TYPE DataType2;
}

GENERIC_TYPE myVar;
//use myVar in remaining code 

我知道从符号#开始的行被认为是处理器命令,它将在编译时被知道并替换。但是,我在if条件下validCondition更改了运行时间并根据#define定义。

那么在这种情况下处理器将如何工作?

任何人都有根据条件定义不同数据类型变量的想法吗?

2 个答案:

答案 0 :(得分:1)

您可以为这些数据类型定义包装类型:

struct DayAction {
  int day;
  char *action;
  size_t actionlen;
};

然后,拥有该类型的变量,并根据您的条件填写该变量的字段:

struct DayAction day_action;

if (condition()) {
  day_action.day = dt1.day;
  day_action.action = dt1.action;
  day_acion.actionlen = sizeof dt1.action;
}

之后,您可以对day_action进行操作,因为它指向原始数据。

如果您需要更改dt1.day,请使DayAction.day成为指针。 如果您不需要更改action,请将DayAction.action设为const char *

答案 1 :(得分:0)

如何只保留一个struct

typedef struct {
    int day;
    char *action;
} DataType;

然后根据某些条件,使用您需要的正确字节数调用malloc()

DataType dt;
if (checkWhateverCondionYouWant)
    dt.action = malloc(someSize);

HTH。