0

我想知道我们是否可以声明如下内容。我的要求是使用相同的变量但不同的结构。如果可以完成以下操作,你们可以帮助我吗?请建议是否还有其他选择。

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

问候

4

5 回答 5

5

案例标签不会引入新的范围。您要么必须在使用不同名称之前声明它们switch,要么将每种情况下的代码括在大括号中,例如

case 1:
    {
        struct_1 *name = NULL;
        ...
    }
    break;
case 2:
    {
        struct_2 *name = NULL;
        ...
    }
    break;
于 2013-07-29T13:06:40.673 回答
0

如果我知道您想保留相同的变量“名称”并稍后将其用作指向按大小写选择的结构的指针。然后您可以使用 void *name (在切换之前声明),并在每种情况下根据所需的结构指针对 this 指针进行类型转换。并在需要时使用“名称”。

于 2013-07-29T13:39:03.083 回答
0

联盟

为了能够为不同的类型使用相同的变量名,您还可以使用不同类型中的一个并在语句之前声明union该类型的变量。unionswitch

示例代码:

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 = ...;
于 2013-07-29T13:57:54.170 回答
0

先声明变量switch

于 2013-07-29T13:08:34.813 回答
0

void 指针可以被取消引用,否则它们将几乎无用。但是编译器需要知道指针指向的数据类型,所以当你想访问指针指向的数据时,你必须使用类型转换。

miikkas 上面的答案已经显示了类型转换的示例。

于 2016-11-21T12:15:00.150 回答