首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C语言基础:typedef的使用

  • 23-09-22 01:23
  • 2051
  • 8680
blog.csdn.net

本文研究C语言中typedef关键字的作用。

文章目录

  • 1 typedef关键字的作用
  • 2 typedef关键字的场景
    • 2.1 重新定义基本类型
    • 2.2 为变量定义专属类型
    • 2.3 定义结构体、枚举量、数组
  • 3 总结

1 typedef关键字的作用

本科学过C语言的朋友都知道数据类型的概念。C语言中有整型,如char、int、short等等;也有浮点类型,如float、double。

typedef关键字就是给这些数据类型起一个别的名字,然后用这个自己起的名字来定义变量。比如如下语句就把char类型起了个新的名字叫int8。然后用int8定义了一个变量a1。

typedef char int8;
int8 a1;
  • 1
  • 2

那么为什么不能直接用基础类型来定义变量,本文就研究其中的原因。

2 typedef关键字的场景

2.1 重新定义基本类型

Simulink生成的代码中,在rtwtypes.h头文件中专门有一组typedef,它们把一些基本类型,如char、float等,定义成别的名字。
在这里插入图片描述
然后定义变量的时候不去用基础类型定义,而是用int8_T,real32_T这些自己起名的类型去定义变量。
在这里插入图片描述
以前博主对此很费解,为啥要没事找事转一道。后来接触到MISRA-C规范后,才明白里面的意义。MISRA-C 2004规范的6.3条中说到,应该使用指示了大小和符号的typedef以代替基本数据类型。
在这里插入图片描述
所以,把unsigned char用typedef转换成uint8_T的话,后面定义变量的时候就可以很清楚的知道这个变量是uint8的,范围是0~255。

另外,32位系统和64位系统中,基础类型对应的字节长度可能不同。如果整个工程中的代码全都是基础类型,再移植代码到新系统的时候可能要全部改一遍。而如果用了typedef,只需要改一下typedef这一句就行了。

2.2 为变量定义专属类型

首先思考一个场景。一个C语言工程中有很多函数,他们都需要传参数ObjNum,输入雷达检测到的目标个数。由于在函数定义的时候需要明确传递参数的数据类型,所以这些函数就定义成这样:

void function_1(uint8 ObjNum);
void function_2(uint8 ObjNum);
void function_3(uint8 ObjNum);
  • 1
  • 2
  • 3

uint8最大可以表示255,如果想把ObjNum改成uint16类型的,就需要改3次(在大的工程中不止3个),所以一个好的办法就是用typedef,给这个变量定义一个专属的类型名称,如下:

typedef uint8 ObjNumType;
void function_1(ObjNumType ObjNum);
void function_2(ObjNumType ObjNum);
void function_3(ObjNumType ObjNum);
  • 1
  • 2
  • 3
  • 4

这样,只需要在typedef把uint8改成uint16就可以。

2.3 定义结构体、枚举量、数组

结构体由程序员自己定义,通常是把一些有着共同特征的变量打包在一起,以便增强可读性。例如,汽车动力学相关的变量就包括车速、横摆角速度、加速踏板等,可以把他们打包到一起定义一个结构体类型:

typedef struct VehicleDynamics_Tag
{
    float32 VehicleSpeed;
    float32 Yawrate;
    bool AccelerationPedal;
} VehicleDynamics_Type;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后再用结构体类型定义一个结构体变量:

VehicleDynamics_Type vehicle_dynamics;
  • 1

另外,枚举量的定义也类似,譬如定义LKA功能状态:

typedef enum LKAStatus_Tag
{
    LKA_OFF= 0,
    LKA_STANDBY,
    LKA_ACTIVE,
    LKA_OVERRIDE
} LKAStatus_Type;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

对于数组定义,可以看一个例子。

#include 

typedef unsigned char ObjID[10];

int main()
{
    ObjID id;

    for (int i = 0; i < 10; i++)
    {
        id[i] = i;
    }
    printf("id[4] = %d
", id[4]);
    printf("id = %p
", id);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

用typedef定义一个无符号整型的数组类型ObjID[10],这表明类型是ObjID,数组size是10。在主函数中再通过ObjID定义id,注意这里的id变量指的是数组的首地址。再通过下标就可以访问数组元素,例如id[4]。

打印数组元素和数组地址如下图:
在这里插入图片描述

3 总结

目前博主工作中遇到的typedef主要就是以上3种非常常见的情况。

>>返回个人博客总目录

文章知识点与官方知识档案匹配,可进一步学习相关知识
C技能树首页概览160872 人正在系统学习中
注:本文转载自blog.csdn.net的chhttty的文章"https://blog.csdn.net/u013288925/article/details/107119666"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top