C有变体数据类型吗?

时间:2014-02-06 13:08:05

标签: c

如何修复以下程序的c编译错误?

struct a{
      int a;
};
struct b{
    int b;
};
int main(){

int toggle =1;
int y = (toggle==1) && (struct a x);
y =     (toggle==0) && (struct b x);

if(toggle==1){
    x.a = 10;
    printf("%d ",x.a);
}else {
    x.b = 20;
    printf("%d ",x.b);
}
printf("hi");
return 0;
}

当我编译这个程序时,在'x'“

之前得到错误”expected')'

我需要创建静态对象。有没有其他方法来实现这一目标?

1 个答案:

答案 0 :(得分:3)

您不能将声明作为表达式的一部分。您需要找出处理条件编译/声明的另一种方法(可能使用预处理器?)。


一种可能的方法是使用一个公共基本结构,其中“toggle”作为标志,并使用指向此基本结构类型的指针 - 转换为正确的结构。 C中的“inhearitance”柔和,可以这么说。像

这样的东西
enum Type
{
    TYPE_A,
    TYPE_B
};

struct Base
{
    int type;  /* One of the Type enumerations */
};

struct A
{
    struct Base base;
    int field_unique_to_a;
};

struct B
{
    struct Base base;
    double field_unique_to_b;
};

int main(void)
{
    int toggle = 1;
    struct Base *base_ptr;

    if (toggle == 1)
    {
        base_ptr = calloc(1, sizeof(A));  /* Use calloc to initialize the data */
        base_ptr->type = TYPE_A;
    }
    else
    {
        base_ptr = calloc(1, sizeof(B));  /* Use calloc to initialize the data */
        base_ptr->type = TYPE_B;
    }

    /* Now `base_ptr` points either to a `A` or a `B` structure */

    if (base_ptr->type == TYPE_A)
    {
        ((struct A *) base_ptr)->field_unique_to_a = 1;
    }
    else
    {
        ((struct B *) base_ptr)->field_unique_to_b = 12.34;
    }

    /* ... */
}