当前位置:网站首页>C专家编程 第3章 分析C语言的声明 3.7 typedef struct foo{... foo;}的含义
C专家编程 第3章 分析C语言的声明 3.7 typedef struct foo{... foo;}的含义
2022-08-03 16:09:00 【weixin_客子光阴】
/*3.7 typedef struct foo {...foo;}的含义 */
/*C 语言存在多种名字空间:
*标签名(label name);
*标签(tag)---这个名字空间用于所有的结构、枚举和联合
*成员名---每个结构或联合都有自身的名字空间;
*其他
*/
/*在同一个名字空间里,任何名字必须具有唯一性,但在不同的名字空间
*可以存在相同的名字。
*/
/*
struct vnode {
long v_flag;
long v_usecount;
struct vnode *v_freef;
struct vnode *v_op;
};
*/
#include <stdio.h>
struct foo {
int foo;
int foo2;
} foo;
int main() {
printf("sizeof(foo) = %d, sizeof(int) = %d\n", sizeof(foo), sizeof(int));
}
/* 输出:

*/
/*sizeof(foo)中的foo代表的是一种结构类型的变量*/
//合法的
typedef struct baz {
int baz;
} baz;
struct baz variable_1;
baz variable_2;
typedef struct my_tag{
int i;
}my_type;
struct my_tag variable_1;
my_type variable_2;
这个typedef声明引入了my_type这个名字作为struct my_tag{int i;}的简写形式。但它同时也引入了结构标签my_tag,在它前面加个关键字struct可以表示同样的意思。如果你用同一个标识符表示结构类型和typedef声明引入的标签,那么以后使用这个标识符时前面就不用加上关键字struct了,但这个方法向人们灌输了一种完全错误的思维习惯。令人不快的是,这种与结构有关的typedef声明的语法确切地反映了组合结构类型与变量声明的语法。
typedef struct fruit{int weight, price_per_lb;} fruit;
/*语句1*/
struct veg{
int weight, price_per_lb;
} veg; /*语句2*/
struct fruit mandarin; /*使用结构标签“fruit”*/
fruit mandarin; /*使用结构类型“fruit”*/
struct veg potato;
//error
veg cabbage;
int i;
//error
i j;
/*小启发*/
/*操作typedef的提示*/
/*不要为了方便起见而为结构使用typedef*/
/*typedef应该使用在一下几个方面:
*数组、结构、指针以及函数的组合类型
*可移植类型。比如当你需要一种至少20比特的类型时,可以让他成为typedef的类型
*这样,当把代码移植到不同的平台时,要选择正确的类型,如short、int、long时,
*只要在typedef中进行修改就可以了,无须对每个声明都加以修改。
*typedef也可以为后面的强制类型转换提供一个简单的名字,如:
*/
typedef int (*ptr_to_int_fun)(void);
char *p; ...
= (ptr_to_int_fun)(p);
/*应该始终在结构的定义中使用结构标签,即使它并非必需的*/
/*当你有两个不同的东西时,在计算机科学中一个比较好的原则就是用不同的名字
*来称呼他们*/
边栏推荐
猜你喜欢

protobuf 中数据编码规则

如何分析周活跃率?

Windows 事件转发到 SQL 数据库

Yii2安装遇到Loading composer repositories with package information

Small Tools (4) integrated Seata1.5.2 distributed transactions

【Unity入门计划】基本概念(8)-瓦片地图 TileMap 01

leetcode:189. 轮转数组

使用Make/CMake编译ARM裸机程序(基于HT32F52352 Cortex-M0+)

一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样

用友YonSuite与旺店通数据集成对接-技术篇2
随机推荐
我在滴滴做开源
【Unity入门计划】基本概念(6)-精灵渲染器 Sprite Renderer
JD6606SP5_JD6606SSP_JD6606SASP_JD6621W7百盛新纪元授权代理商
小熊派——无线联网开发
袁小林:沃尔沃专注于出行的安全感,并且把它做到极致
黄致绮 荣获第六季完美童模全球总决赛 全国总冠军
mysql delete 执行报错:You can‘t specify target table ‘doctor_info‘ for update in FROM clause
使用 PowerShell 将 Windows 转发事件导入 SQL Server
30W 2C(JD6606S + FP6652X2)BOM
【深度学习】今日bug(8月2)
详谈RDMA技术原理和三种实现方式
从零开始搭建MySQL主从复制架构
Windows 事件查看器记录到 MYSQL
不可忽略!户外LED显示屏的特点及优势
When mobile applications go overseas, is your "network optimization" holding back?
Fortinet产品导入AWS AMI操作文档
AI+BI+Visualization, Deep Analysis of Sugar BI Architecture
DAYU200 OpenHarmony标准系统HDMI全屏显示
window.open不显示favicon.icon
mysql delete execution error: You can't specify target table 'doctor_info' for update in FROM clause