我想知道我们是否可以声明如下内容。我的要求是使用相同的变量但不同的结构。如果可以完成以下操作,你们可以帮助我吗?请建议是否还有其他选择。
switch(x)
{
case 1:
struct_1 *name = NULL;
break;
case 2:
struct_2 *name = NULL;
break;
case 3:
struct_3 *name = NULL;
break;
default:
}
问候
我想知道我们是否可以声明如下内容。我的要求是使用相同的变量但不同的结构。如果可以完成以下操作,你们可以帮助我吗?请建议是否还有其他选择。
switch(x)
{
case 1:
struct_1 *name = NULL;
break;
case 2:
struct_2 *name = NULL;
break;
case 3:
struct_3 *name = NULL;
break;
default:
}
问候
案例标签不会引入新的范围。您要么必须在使用不同名称之前声明它们switch
,要么将每种情况下的代码括在大括号中,例如
case 1:
{
struct_1 *name = NULL;
...
}
break;
case 2:
{
struct_2 *name = NULL;
...
}
break;
如果我知道您想保留相同的变量“名称”并稍后将其用作指向按大小写选择的结构的指针。然后您可以使用 void *name (在切换之前声明),并在每种情况下根据所需的结构指针对 this 指针进行类型转换。并在需要时使用“名称”。
为了能够为不同的类型使用相同的变量名,您还可以使用不同类型中的一个并在语句之前声明union
该类型的变量。union
switch
示例代码:
typedef union {
struct_1 s1;
struct_2 s2;
struct_3 s3;
} anyof123;
在switch
声明之前:
anyof123 *name = malloc(sizeof(anyof123)); // Example, allocate some memory.
并在switch
声明中:
case 1:
{
struct_1 s1 = ...; // Just an example, fill with your own declaration.
name->s1 = s1;
}
break;
name
并且之后可以在范围之外访问结果变量switch
。
正如 Kavan Shah 所指出的,您可以使用void
指针并记住每次访问它时都将其转换为所需的类型,如下所示:
((struct_1*)name)->my_data = ...;
先声明变量switch
void 指针可以被取消引用,否则它们将几乎无用。但是编译器需要知道指针指向的数据类型,所以当你想访问指针指向的数据时,你必须使用类型转换。
miikkas 上面的答案已经显示了类型转换的示例。