在switch语句中的case标签中声明相同的变量

时间:2013-07-29 13:02:17

标签: c switch-statement declaration

我想知道我们是否可以宣布下面的内容。 我的要求是使用相同的变量但不同的结构。 如果可以做到以下情况,你们可以帮助我吗? 如果还有其他选择,请建议。

switch(x)
{
  case 1:
    struct_1 *name = NULL;
    break;
  case 2:
    struct_2 *name = NULL;
    break;
  case 3:
    struct_3 *name = NULL;
    break;
  default:
}

此致

5 个答案:

答案 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回答已经显示了类型转换的示例。