struct 组合和 typedef 有什么区别?

问题描述 投票:0回答:2

无论是使用 struct 组成结构体类型还是使用 typedef 定义结构体的别名,结果看起来都是一样的。这两种形式有什么区别?

#include <stdio.h>

struct TypeDefinition{
  int a;
};

typedef struct type_id {
  struct TypeDefinition type_;
} type_id_t;

typedef struct TypeDefinition Type2;

int main()
{
  struct TypeDefinition type_def = {
    .a = 10
  };

  type_id_t * p_type = (type_id_t *)&type_def;
  Type2 * p_type2 =  &type_def;

  printf("value:%d\n", p_type->type_.a);
  printf("value(type_2):%d\n", p_type2->a);
  printf("size1:%ld, size2:%ld\n", sizeof(struct TypeDefinition), sizeof(type_id_t));

  return 0;
}

使用gdb调试程序,

p_type
p_type2
的地址是相同的。该地址的内容也是一样的。

c struct composition
2个回答
0
投票

在 C 代码的上下文中,使用

struct
组成结构体类型并使用
typedef
定义结构体的别名有不同的用途,但它们可以在内存布局和访问方面产生类似的结果。

让我们来分解一下差异:

1.使用struct直接定义:

struct TypeDefinition {
    int a;
};

在这里,您直接定义了一个名为

TypeDefinition
的结构体。

2。 Typedef 定义别名:

typedef struct type_id {
struct TypeDefinition type_;
} type_id_t;

在本例中,您将为结构体

type_id_t
创建别名
struct TypeDefinition
。这对于为类型提供更清晰的名称很有用。

3.对原始结构使用 Typedef:

typedef struct TypeDefinition Type2;

在这里,您正在为原始结构创建另一个别名 (

Type2
)。

type_id_t
Type2
最终在内存布局方面都等同于
struct TypeDefinition
。 Typedef 主要用于创建更具可读性和简洁的代码。他们并没有引入新的类型;而是引入了新的类型。他们为现有类型创建一个新名称。

在您的代码中,当您打印

struct TypeDefinition
type_id_t
的大小时,您应该看到相同的大小,表明它们是相同的类型。当您使用 GDB 进行调试时,您会观察到
p_type
p_type2
具有相同的地址,因为两者都指向相同的内存位置。它们是同一类型的不同名称。

直接使用

struct
或使用
typedef
的选择取决于您的编码风格和偏好。
typedef
可以使代码更具可读性,尤其是在处理复杂类型时。然而,在更简单的情况下,直接使用
struct
可能会更直接。


0
投票

C 2017 标准 6.7.8p3 说:

typedef 声明不会引入新类型,而只会引入所指定类型的同义词。 [...] typedef 名称与普通声明符中声明的其他标识符共享相同的名称空间。

© www.soinside.com 2019 - 2024. All rights reserved.