C语言中结构体标签的使用

C语言中结构体标签的使用

我们都知道,结构体标签就是结构体的名称,为结构体命名可以方便我们在后续继续使用该结构体。

struct student {
	char* name;
	int age;
}

struct student zhangsan;
struct student lisi;

这里定义了两个student结构体类型的变量,每次使用时都需要加上struct,比较麻烦。实际上更多情况下
我们会使用typedef来给一个匿名结构体起个别名,不用每次都输入struct

typedef struct {
	char* name;
	int age;
} student;

student zhangsan;
student lisi;

这个结构体没有标签,所以是个匿名结构体,但是我们通过typedef给他定义一个别名student,通过别名
定义变量不需要加struct前缀。

有了typedef,似乎结构体标签没有存在的必要了,其实不然。

使用typedef的写法,如果student类型要暴露给其他模块,那么必须要写在头文件当中。这将同时暴露
所有结构体的成员,有时候这是违背设计者意愿的。可能设计者希望其他模块的使用者只通过提供的API
来访问student,或者有些成员仅仅是内部使用。

使用结构体标签就可以避免这个问题。我们可以将结构体定义写在源文件中,头文件中仅包含结构体的
声明。

struct student;
extern struct student* create_student(const char* name);
extern void set_student_age(struct student* s, int age);

使用者将不能自己创建student类型对象,只能通过create_student来获取,也不能通过获取到的指针访问
成员age,而是必须通过set_student_age函数接口。

这样写还能避免student结构体成员的变动,导致使用者需要重新编译。当然,为了不重复使用struct这个
单词,我们仍然可以使用typedef来重命名。

typedef struct student student_t;
extern student_t* create_student(const char* name);
extern void set_student_age(student_t* s, int age);

看到C++的前向声明,回过头来才发现C还有那么多细节。

回答: 在C语言结构体的属性是通过成员变量来定义的。结构体的声明语法如下: struct \[structure tag\] { member definition; member definition; ... member definition; } \[one or more structure variables\]; 其结构体标签是可选的,用于给结构体类型起一个名称。成员变量是结构体的属性,可以是任意数据类型,可以有多个成员变量。结构体变量的定义可以在结构体声明之后,也可以在结构体声明的同时进行。结构体变量可以通过结构体标签和成员变量名来访问。 例如,下面是一个描述学生的结构体的例子: typedef struct student { char name\[20\]; char sex\[5\]; char id\[20\]; short int age; } student; 在这个例子,student是结构体标签,可以用来定义结构体类型的变量。结构体类型的成员变量包括name、sex、id和age,它们分别表示学生的姓名、性别、学号和年龄。可以通过结构体变量来访问这些成员变量,例如mation.name表示访问mation结构体变量的name成员变量。 需要注意的是,结构体类型的成员变量的数据类型要与实际使用时的数据类型相匹配,否则可能会导致错误。在打印结构体变量时,要使用与成员变量类型相匹配的占位符。 此外,还可以定义一个空的结构体,用于暂时占位,待后续填充成员变量。例如: struct Books { // TODO } book; 这样定义的book结构体变量暂时没有任何成员变量,可以在后续的代码进行填充。 总结起来,C语言结构体属性是通过成员变量来定义的,可以通过结构体标签和成员变量名来访问。 #### 引用[.reference_title] - *1* *3* [【C语言结构体类型](https://blog.csdn.net/qq_40171445/article/details/122887651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【C语言结构体](https://blog.csdn.net/weixin_52632755/article/details/119980420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值