c++ 之typedef

typedef使用详解 在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。当然,使用typedef就没有这样的问题。2) typedef的特别长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。经过查找,函数名就是一个指针,但是意义是不一样的,如同于数组a[],a和&a其实都是一样的。 阅读详情

原文链接:http://blog.youkuaiyun.com/lwbeyond/article/details/6191942


1. typedef 最简单使用

[c-sharp]  view plain copy
  1. typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4  

你可以在任何需要 long 的上下文中使用 byte_4。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。

2. typedef 修饰数组

[cpp]  view plain copy
  1. typedef char mySizes[100];     
  2. mySizes xxx;   
  3.   
  4. typedef char [100] mySizes; //error  
这里 mySize 就是一个大小为100的 char 数组,sizeof(mySize) 为 100。

3. typedef 修饰指针

[c-sharp]  view plain copy
  1. typedef char * pstr;  
  2. int mystrcmp(pstr, pstr);  
  3. ......  
  4. int mystrcmp(const pstr, const pstr); //error  

这里有一个 typedef 陷阱。标准函数 strcmp()有两个‘const char *’类型的参数。因此,它可能会误导人们象上面这样声明。

按照顺序,‘const pstr’被解释为‘char * const’(一个指向 char 的常量指针),而不是‘const char *’(指向常量 char 的指针)。

其实这点很好理解,const 就是修饰 pstr 指针的,并不是简单替换。

这个问题很容易解决:

[c-sharp]  view plain copy
  1. typedef const char * cpstr;   
  2. int mystrcmp(cpstr, cpstr); // 现在是正确的  

4. typedef 修饰结构体

[c-sharp]  view plain copy
  1. typedef struct tagMyStruct     
  2. {  
  3.   int iNum;     
  4.   long lLength;     
  5. } MyStruct;  

这语句实际上完成两个操作:
(1).定义一个新的结构类型

[c-sharp]  view plain copy
  1. struct tagMyStruct     
  2. {     
  3.   int iNum;     
  4.   long lLength;     
  5. };     

分析:

tagMyStruct ,实际上是一个临时名字,struct 关键字和 tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用 struct tagMyStruct xxName 来定义变量,但要注意,使用tagMyStruct xxxrName 来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

(2). typedef 为这个新的结构起了一个名字,叫 MyStruct。

typedef struct tagMyStruct MyStruct;因此,MyStruct实际上相当于struct  tagMyStruct,我们可以使用MyStruct varName来定义变量。

 5. typedef & 结构的问题

在结构中包含指向它自己的指针

[c-sharp]  view plain copy
  1. typedef struct tagNode     
  2. {     
  3.   char *pItem;     
  4.   pNode pNext; // error    
  5. } *pNode;   

答案与分析: 
    根据我们上面的阐述可以知道:要知道pNode表示的是类型的新名字,那么在 类型本身还没有建立完成的时候,这个类型的新名字 pNoed 也还不存在,也就是说这个时候编译器根本不认识pNode。

解决这个问题的方法有多种:

[cpp]  view plain copy
  1. // 1)  
  2. typedef struct tagNode     
  3. {  
  4.   char *pItem;  
  5.   struct tagNode *pNext;     
  6. } *pNode;     
  7.   
  8. // 2)     
  9. typedef struct tagNode* pNode;     
  10. struct tagNode     
  11. {  
  12.   char *pItem;  
  13.   pNode pNext;  
  14. };  
  15. //注意:在这个例子中,你用 typedef 给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。  
  16.   
  17. // 3)规范做法:     
  18. struct tagNode     
  19. {  
  20.   char *pItem;   
  21.   struct tagNode *pNext;     
  22. };  
  23. typedef struct tagNode *pNode;   
6. typedef 与 #define的问题
有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?

[c-sharp]  view plain copy
  1. typedef char* pStr;     
  2. #define pStr char*;     

答案与分析:

    通常讲,typedef要比#define要好,特别是在有指针的场合。
请看例子:

[c-sharp]  view plain copy
  1. typedef char* pStr1;   
  2. #define pStr2 char *   
  3. pStr1 s1, s2; // char* s1; char* s2;   
  4. pStr2 s3, s4; // char* s3, s4;即 char s4;   

在上述的变量定义中,s4则定义成了char,不是我们所预期的指针变量, 根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

上例中define语句必须写成 pStr2 s3, *s4; 这这样才能正常执行。

7. typedef 与 复杂的变量声明

在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:   
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?

[cpp]  view plain copy
  1. int *(*a[5])(int, char*);  
  2.   
  3. void (*b[10]) (void (*)());  
  4.   
  5. double(*)() (*pa)[9];   

答案与分析:

    对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。

8. typedef 修饰函数指针

[cpp]  view plain copy
  1. //1. 定义一个函数指针  
  2. typedef int(_cdecl *FUN_Start)(UCHAR);  
  3. /* typedef的功能是定义新的类型。定义这种类型为指向某种函数的指针,这函数以一个UCHAO为参数并返回int类型。*/  
  4.   
  5. //2. 定义这个函数指针的一个变量  
  6. FUN_Start fun_Start;   
  7.   
  8. //3. 把函数的地址赋给此函数指针  
  9. fun_Start = (FUN_Start)GetProcAddress(m_hLibrary,"Rec_SetDevice");  
  10.   
  11. //4. 调用  
  12. if (fun_Start('a') == 1) //直接通过函数指针调用  
  13. {......}  
  14.   
  15. //当然也可以这样  
  16. if ( (*)fun_Start('a') == 1) //先用*fun_start取出它所指的函数类型,再调用  
  17. {......}  
因为函数名就是一个地址,该函数名所代表的函数的入口地址。

 

注:

总之一点,不要把typedef看成简单的替换,要看成一种新的命名,要与default相区别!!

使用typedef定义C/C++中的void 在上面的代码中,我们首先使用typedef定义了一个名为CustomFunction的函数指针类型,该函数指针类型指向无返回值的函数。在上面的代码中,我们使用typedef void定义了一个名为Point的结构体别名,并定义了一个名为PrintPoint的函数,用于打印结构体Point的成员。本文将详细介绍typedef void的用法,并提供相应的源代码示例。通过使用typedef void,我们成功地为无返回值的函数定义了一个更具有描述性的别名,这样我们可以更方便地使用它,并将其赋值给其他变量。 阅读详情

相关推荐

【CPP知识】typedef数据类型重定义

3.1 、简化类型申明,比如原来的数据类型long double,可以更见简化成my_float;int x;int y;int z;} sample;// 使用typedef简化了类型 sample s1 = {// 以下是不使用typedef则显得复杂。int y;int z;} s2 = {3.2、简化函数申明,time_t time(time_t *);

jn10010537的博客 2224

【C/C++】typedef用法详解

typedef 声明,简称 typedef,人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。 一、typedef的四个用途 1.1、用途一:定义一种类型易于记忆的别名,而不只是简单的宏替换。 a...

qq_34018840的博客 5829

RV1126B芯片实战:如何用这款视觉处理器SoC打造你的第一个AI摄像头项目

本文详细介绍了如何利用瑞芯微RV1126B视觉处理器SoC从零构建AI摄像头项目。涵盖硬件选型、开发环境搭建、ISP配置、AI模型部署及系统集成等关键步骤,帮助开发者高效实现边缘计算方案,特别适合智能安防和工业检测应用。

dropout6artist的博客 931

C++ typedef

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.即typedef [type] [new name]. 在编程中使用typedef目的一般有两个, 一个是给变量一个易记且意义明确的新名字, 一个是简化一些比较复杂的类型声明。 (1)用typedef声明一个新类型名来代替已有的类型名。如: typedef int Status //指定标识符Status代表in...

sinat_31608641的博客 3191

Benchmark系列——基本概念和分类

本文主要介绍了Benchmark的基本概念和分类情况。

Bluetangos的博客 8438

Python:同花顺全数据接口

# -*- coding: utf-8 -*- from iFinDPy import * from datetime import datetime import pandas as pd import time as _time import json from threading import Thread,Lock,Semaphore import requests sem = Semaphore(5) # 此变量用于控制最大并发数 dllock = Lock() #此变量用来控制实时行情推

代码过客 4万+

C++ typedef用法详解

然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;

A19720252059的博客 2940

避坑指南:Vue2中使用TinyMCE5常见问题解决方案(含PowerPaste插件异常处理)

本文针对Vue2项目中集成TinyMCE 5富文本编辑器时遇到的高频疑难问题,提供了一套深度实战解决方案。内容涵盖环境搭建、资源路径配置、图片与视频上传处理、以及替代PowerPaste插件的自定义粘贴清理方案,旨在帮助开发者有效规避常见陷阱,构建稳定可靠的内容编辑功能。

weixin_29012677的博客 155

深入理解c++中.h/.cpp文件,extern关键字,typedef,using关键字

源文件是代码的“具体实现”。它包含了所有在头文件中声明的实体所对应的完整定义。源文件中应该包含什么?头文件的包含:#include "my_header.h",以获取所有声明。函数的完整定义类成员函数的完整实现全局变量的定义(这是该变量唯一被分配内存的地方)为什么要这么做?每个 .cpp 文件都被编译器单独编译成一个目标文件(.o 或 .obj)。这些目标文件包含了实际的机器码。

cyz322649的博客 1432

统计滤波器

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对统计滤波器做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1644

Qt C++ 信号发生器控制软件

waveformComboBox->addItems({"正弦波", "方波", "三角波", "锯齿波", "脉冲波"});frequencyLabel = new QLabel("频率 (Hz):");amplitudeLabel = new QLabel("幅值 (V):");offsetLabel = new QLabel("直流偏移 (V):");} else if (currentWaveform == "三角波") {} else if (currentWaveform == "方波") {

寒寒豆豆软件公司的博客 125

C++ typedef 以及 typedef struct 用法

C++ typedef 以及typedef struct 用法1 概述2 typedef作用及用法3 区别 #define4 typedef struct在c/c++中的区别4.1区别一4.2区别二5 参考资料 1 概述 typedef 为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 typedef 本身是一种存储类的关键字,与 auto、extern、static、register 等关键字不能出现在同一个表

liuluan03161009的博客 8255

什么是 SAP Fiori 的 Technical Catalog

笔者之前的文章曾经提到一个叫做本文介绍 Technical Catalog 这个概念在 SAP Fiori 技术体系中的作用。首先我们如何在系统里查看这个 Catalog SAP_BASIS_TCR_T 里面包含的内容呢?如果大家照着本文开头那篇文章里提到的步骤,那么在自己系统里会创建好名叫的 PFCG role.我们登录 ABAP 系统,启动事务码 PFCG,打开这个 role, 就能看到它。展开之后,发现它扮演着一个容器的角色,里面包含了很多 ABAP 对象。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 743

C++ typedef详解

typedef的用途 1)定义一种类型的别名 注意typedef并不是简单的宏替换,如下例所示: int main() { char *pa,pb;//声明了一个指向字符变量的指针pa,和一个字符变量pb pa = "hello"; pb = "hello";//报错,不能将const char*类型的值赋给char类型的实体 pb = 'h';//正常 return 0; } 再看以下示例: int main() { typedef char* PCHAR

饭的笔记本 2万+

2、Minikube安装Ingress

文章目录前言一、Ingress安装二、Ingress Demo1.创建一个pod和service2.部署ingress3.添加minikube域名映射三、遇到的坑 前言 上篇介绍了Minikube的安装,本篇介绍一下如何在Minikube中安装Ingress。 一、Ingress安装 Ingress安装很简单,Minikube里面带了Ingress附件。 安装Ingress minikube addons enable ingress 禁用Ingress minikube addons disa

star_apple的博客 3071

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++ 中typedef的用法总结

在总结中,比较简单的我只是做了简略的总结,对我来说比较难理解的做了重点的解析。用于为基本数据类型定义一个新的名字,使代码更具可读性或便于修改。示例:这里将int类型定义为Integer,之后就可以使用Integer来声明变量,就像使用int一样。这种方式在代码中如果需要频繁使用int类型,并且希望提高代码可读性(例如,Integer可能暗示这个int变量在特定的业务逻辑中有特殊含义)或者在需要修改类型时(比如将int改为long),只需要修改typedef语句即可。在深入typedef。

small__dogs的博客 4521

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++typedef的详细用法

转自知乎的一段解释:作者:知乎用户链接:https://www.zhihu.com/question/29798061/answer/144423125来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。不太想谈#define, 在题主的例子的这种用法里, 它就是个文本替换工具, 预处理器完成的, 无脑替换, 跟word里的replace一模一样, 不关编译器的事. 我想...

hai008007的博客 8万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C/C++中typedef用于结构体的特性

typedef在C文件中,可以使得声明结构变量不再需要加struct。但是在CPP文件中,不需要typedef也 可以无需struct。本质是,因为CPP文件中,struct实际上是一种类的声明,与class类的区别是, struct类是默认将成员设为public权限,而class类默认将成员设为private权限。 typedef 在C/C++中的主要作用是给声明(只能作用于声明)起别名, 例如typdef int alias,则alias等效于int,如声明整形变量 alias x ; 例如struct

m0_59086897的博客 305

C/Cpp的 typedef

C/Cpp的 typedef参考: https://en.wikipedia.org/wiki/Typedef http://publications.gbdirect.co.uk/c_book/chapter8/typedef.htmlIndicating what a variable represents 指示一个新名字来代表typedef int km_per_hour; typedef

XXXXX的专栏 899

C++中typedef和using

一、typedef typedef是C/C++语言中保留的关键字,用来定义一种数据类型的别名。 ypedef定义的类型的作用域只在该语句的作用域之内 typedef经常使用的场景包括以下几种: 指定一个简单的别名,避免了书写过长的类型名称 实现一种定长的类型,在跨平台编程的时候尤其重要 使用一种方便阅读的单词来作为别名,方便阅读代码 1.1 减少书写类型的长度 这一使用方式比较常见的...

youtiao_hulatang的博客 7677

C++ typedef

转自知乎的一段解释: 作者:知乎用户 链接:https://www.zhihu.com/question/29798061/answer/144423125 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 不太想谈#define, 在题主的例子的这种用法里, 它就是个文本替换工具, 预处理器完成的, 无脑替换, 跟word里的replace一模一样, ...

zlb666的博客 239

C++数据结构中typedef是什么?typedef的作用?typedef的怎么理解?

C++数据结构中typedef是什么?typedef的作用?typedef的怎么理解? 总结typedef int a;//此时 int=a可以相互换 #include<iostream> using namespace std; typedef int a;//此时 int=a可以相互换 int main() { int i=10; a j=20; cout<<"i:"<<i<<endl; cout<<"j:"<<j

shangxianjiao的博客 2737

[C++] typedef

[C++] typedef 2020/10/31 1. 概述 typedef为C语言关键字,作用为一种数据类型定义别名。包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 typedef本身是一种存储类的关键字,与auto、extern、static、register等关键字不能出现在同一个表达式中。 2. 作用及用法 2.1 typedef的用法 使用typedef定义新类型的方法:在传统的变量声明表达式里,用(新的)类型名替换变量名,然后把关键字typedef加在该语句的开

mouliu6141的博客 499

C++ typedef 用法详解

typedef是替一个对象取一个别名,以此增强程序的可读性。 1 定义一种数据类型的别名 typedef int INT; //定义int类型的一个别名INT。注意:末尾的分号 typedef char* pStr; 2 定义结构体的别名(很久远的事情了,现在C++已经不存在这个问题) struct sPositon //结构体定义 { int x; int ...

cuizhiyi2008的专栏 5365

4、define和typedef在CPP中的一点使用小技巧

define IN//a为出入参数,b是要输出的参数b = a * 2;return b;这种情况,目前遇到的情况是定义函数指针变量//定义普通的函数指针类型int main()//存储对应的函数名(Func是上面使用typedef定义的变量),函数描述,函数id。

山间点烟雨 491

C++的typedef

typedef typedef为一个已有的类型定义一个新的名字 typedef 类型 新名字 typedef int feel //这会告诉编译器feel是int的另一个名称 #include <iostream> using namespace std; int main () { typedef int feel; feel a = 10; printf("%d", a); } 3 typedef与#define 两者的区别如下: #define进行简单的进行字符串替换。 #

weixin_52045928的博客 440
上一篇: C++输入cin详解
下一篇: STL概述
fly_fish_long
博客等级 码龄11年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值