无论是使用 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
组成结构体类型并使用 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
可能会更直接。
C 2017 标准 6.7.8p3 说:
typedef 声明不会引入新类型,而只会引入所指定类型的同义词。 [...] typedef 名称与普通声明符中声明的其他标识符共享相同的名称空间。