我想知道我们是否可以宣布下面的内容。 我的要求是使用相同的变量但不同的结构。 如果可以做到以下情况,你们可以帮助我吗? 如果还有其他选择,请建议。
switch(x)
{
case 1:
struct_1 *name = NULL;
break;
case 2:
struct_2 *name = NULL;
break;
case 3:
struct_3 *name = NULL;
break;
default:
}
此致
答案 0 :(得分:5)
案例标签不会引入新范围。您必须在具有不同名称的switch
之前声明它们,或者在每种情况下将代码括在大括号中,如
case 1:
{
struct_1 *name = NULL;
...
}
break;
case 2:
{
struct_2 *name = NULL;
...
}
break;
答案 1 :(得分:0)
在switch
答案 2 :(得分:0)
如果我理解你想要保留相同的变量“name”并在以后使用它作为按案例选择的结构的指针。然后你可以使用void * name(在switch之前声明),并且在每种情况下按照所需的结构指针对这个指针进行类型转换。并在以后根据需要使用“名称”。
答案 3 :(得分:0)
为了能够为不同类型使用相同的变量名,您还可以使用不同类型的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 = ...;
答案 4 :(得分:0)
void指针可以被解除引用,否则它们将无用。 但编译器需要知道指针指向的数据类型,因此每当您想要访问指针指向的数据时,都必须使用类型转换。
上面的miikkas回答已经显示了类型转换的示例。