如何修复以下程序的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')'我需要创建静态对象。有没有其他方法来实现这一目标?
答案 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;
}
/* ... */
}