当前位置: 首页 > news >正文

嵌入式C语言-关键字typedef

定义和作用

typedef是C/C++中的一个关键字,作用是为现有的数据类型(int 、char 、flaot等)创建新的别名,其目的是为了方便阅读和理解代码。

用法

typedef 原有类型名 新类型名;
  1. 基本类型创建别名
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
  1. 指针创建别名
typedef int* ptr;
// 为指针创建别名,使指针类型更加易读,减少漏写*风险
  1. 定义结构体
typedef struct {int x;int y;
}ElogTagLvlFilter, *ElogTagLvlFilter_t;
// 定义ElogTagLvlFilter_t结构体指针别名// 声明结构体指针变量elogTagLvFilter
ElogTagLvlFilter_t elogTagLvFilter;
  1. 定义枚举类型
typedef enum{eRed,eGreen,eBlue,
}color_t;
  1. 定义数组
    在C语言中,可以将固定长度的整型数组作为一个新的数据类型,在利用typedef定义新别名,更加简洁定义此种类型。
typedef int INT_ARRAY_3[3];
// 声明一个INT_ARRAY_3的数组变量
INT_ARRAY_3 array;void example(void)
{INT_ARRAY_3 arr = {1,2,3};for(int i=0; i<3;i++){printf("arr[%d] = %d\r\n",i,arr[i]));}
}
  1. 定义指针数组类型
// 定义一个新的类型IntPtrArray,表示一个包含3个int指针数组
typedef int *IntPtrArray_t[3];void example(void)
{int a = 1, b = 3, c = 4;IntPtrArray_t ptrArray = {&a, &b, &c};for(int i = 0; i < 3; i++){printf("ptrArray[%d] = %d\r\n", i, *ptrArray[i]);}
}
  1. 定义数组指针类型
typedef int (*ArrayPtr)[3];void example(void)
{int arr[3] = {1,2,3};ArrayPtr arrPtr = &arr;for(int i = 0; i < 3; i++){printf("arr[%d] = %d\r\n", i, (*arrPtr)[i]);}
}
  1. 定义函数指针
typedef int (*callback_t)(void *);void myCallback(void *data){}callback_t callback = myCallback;// 使用回调函数
callback(someData);

typedef与define区别

typedef和define在C/C++中的核心差异体现在处理机制、类型安全和作用域控制三个维度:前者是编译阶段类型别名定义,具有类型检查和作用域限制;后者是预处理阶段文本替换,缺乏类型安全且全局生效。

本质与处理机制差异

  1. typedef是关键字,创建真正的类型别名,编译器会检查类型兼容性。
typedef int* ptr;
ptr a,b; // a和b类型均为int*类型
  1. define是预处理命令,用于宏定义的文本替换,在预处理阶段完成,无类型检查,仅机械替换字符串,可能引发错误。
#define IntPtr int *IntPtr a,b;
//宏定义展开为
int *a,b; //a为指针,b是int

此处b因替换规则成为普通int而非指针。

语法与功能特性

  1. 类型安全
  • typedef定义的别名具有完整类型信息,编译器会验证类型一致性。
  • #define可能导致类型错误。例如 :
#define IntPtr int *IntPtr a,b;
//宏定义展开为
int *a,b; //a为指针,b是int
  1. 作用域
  • typedef:受限于定义位置的作用域(例如函数内部定义的别名在外部不可见)
  • #define:从定义开始全局生效,直到到文件结束或遇到#undef,易造成命名污染。

应用场景

  1. typedef使用场景如开头所述。
  2. define使用场景
  • 定义常量或简单宏:#define MAX_SIZE (100)
  • 跨平台条件编译:#ifdef WIN32。。。#endif

核心区域总结

特性typedefdefine
本质编译器指令(类型重命名)预处理文本替换
作用域遵循块作用域(如函数、命名空间)从定义处到文件末尾(或#undef)
类型检查编译时进行类型安全校验无类型检查,直接文体替换
处理阶段编译阶段预处理阶段
对指针的支持正确处理指针别名可能因替换导致指针错误
复杂类型支持支持结构体、函数指针等复杂别名需谨慎处理括号,否则容易出错
末尾符合需要分号;不需要分号

建议:typedef不用于定义常量别名;#define不用于数据类型宏定义。


文章转载自:

http://lnLtT0Fm.LLyqm.cn
http://nlD69h5e.LLyqm.cn
http://lFgLmAS9.LLyqm.cn
http://yXYx48sE.LLyqm.cn
http://KbihE0Yn.LLyqm.cn
http://e9bN48On.LLyqm.cn
http://xGeFb2Q8.LLyqm.cn
http://sd3hXyeM.LLyqm.cn
http://kIX6v1ql.LLyqm.cn
http://aBM4A5m8.LLyqm.cn
http://gGQqJEq1.LLyqm.cn
http://HULUQUXo.LLyqm.cn
http://ztmXGGqV.LLyqm.cn
http://jDYXbSOM.LLyqm.cn
http://YrE0uUsB.LLyqm.cn
http://9F34vfoh.LLyqm.cn
http://cfUanjfO.LLyqm.cn
http://GUunT813.LLyqm.cn
http://O1crUFMa.LLyqm.cn
http://akXlL7ye.LLyqm.cn
http://SBXb1RtA.LLyqm.cn
http://RK3F1dgQ.LLyqm.cn
http://GeFupxTI.LLyqm.cn
http://SWyCSdOz.LLyqm.cn
http://Goh3XYUe.LLyqm.cn
http://02lVRKHn.LLyqm.cn
http://DZvQmMx4.LLyqm.cn
http://ueDVN7v5.LLyqm.cn
http://zMal2FRn.LLyqm.cn
http://bZy5ViyF.LLyqm.cn
http://www.dtcms.com/a/380486.html

相关文章:

  • daily notes[44]
  • 手机端APP解析工具开发实战——从0到1实现漏洞检测与接口分析
  • Mysql数据库多表设计
  • open和fopen的区别
  • 排序---选择排序(Selection Sort)
  • 玩转PostMan之调试天气接口-心知天气 API
  • OpenHarmony DHCP 全栈深度剖析:从 DhcpClientStateMachine 到双栈 dhcpd 的客户端-服务器架构设计与源码实现
  • Linux 前后台作业控制及管理
  • 【设计模式】题目小练2
  • 软考中级习题与解答——第五章_面向对象方法(2)
  • 【智慧城市】2025年中国地质大学(武汉)暑期实训优秀作品(4):智矿中国
  • wslg 应用白色边框问题(Jetbrains 系列白色边框)
  • jmeter配置数据库连接步骤
  • Dest1ny安全漫谈-如何做好一个安全项目
  • qt中给QListWidget添加上下文菜单(快捷菜单)
  • Elasticsearch的理解与使用
  • android ndk编译valgrind
  • 实现调用libchdb.a静态连接库中的未公开导出函数
  • Deepoc具身智能无人机:为天空装上「自主决策大脑」
  • JX2202 直阻变比智能测试系统:重构新能源电力检测效率标准
  • 2025 年PT展前瞻:人工智能+如何走进普通人的生活?
  • 【AI论文】分享即关爱:基于集体强化学习经验共享的高效语言模型(LM)后训练方法
  • 二、网页的“化妆师”:从零学习 CSS
  • Rustdesk server docker-compose 一键搭建教程
  • 江科大《STM32入门教程》
  • ABI解析智能合约
  • 数据分析入门——解读36页指标体系建设方案【附全文阅读】
  • 隐私保护的照片分享:基于 Secure JPEG 的解决方案
  • 【面试笔记-Java开发岗】
  • OpenLayers数据源集成 -- 章节八:天地图集成详解