当前位置: 首页 > 编程日记 > 正文

Typedef用法学习

不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,以下是引用的内容(红色部分是我自己写的内容)。

用途一:

定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:

char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,

// 和一个字符变量;

以下则可行:

typedef char* PCHAR;

PCHAR pa, pb;

这种用法很有用,特别是char* pa, pb的定义,初学者往往认为是定义了两个字符型指针,其实不是,而用typedef char* PCHAR就不会出现这样的问题,减少了错误的发生。

用途二:
用在旧的C代码中,帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名对象名,如:

struct tagPOINT1

 {
    int x;

    int y; 
};

struct tagPOINT1 p1;

而在C++中,则可以直接写:结构名对象名,即:tagPOINT1 p1;

typedef struct tagPOINT
{
    int x;

    int y;
}POINT;

POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时

候,或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代

码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。

用途三:

用typedef来定义与平台无关的类型。

比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

typedef long double REAL;

在不支持 long double 的平台二上,改为:

typedef double REAL;

在连 double 都不支持的平台三上,改为:

typedef float REAL;

也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。

标准库就广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。
     这个优点在我们写代码的过程中可以减少不少代码量哦!

用途四:

为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部

分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化

版。举例:

原声明:void (*b[10]) (void (*)());

变量名为b,先替换右边部分括号里的,pFunParam为别名一:

typedef void (*pFunParam)();

再替换左边的变量b,pFunx为别名二:

typedef void (*pFunx)(pFunParam);

原声明的最简化版:

pFunx b[10];
 
原声明:doube(*)() (*e)[9];

变量名为e,先替换左边部分,pFuny为别名一:

typedef double(*pFuny)();

再替换右边的变量e,pFunParamy为别名二

typedef pFuny (*pFunParamy)[9];

原声明的最简化版:

pFunParamy e;

理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号

就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直

到整个声明分析完。举例:

int (*func)(int *p);

首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针

;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以

func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值

类型是int。

int (*func[5])(int *);

func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明

func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符

优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数

组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。

这种用法是比较复杂的,出现的频率也不少,往往在看到这样的用法却不能理解,相信以上的解释能有所帮助。

*****以上为参考部分,以下为本人领悟部分*****

使用示例:

1.比较一:

#include <iostream>

using namespace std;

typedef int (*A) (char, char);

int ss(char a, char b)
{
    cout<<"功能1"<<endl;

cout<<a<<endl;

cout<<b<<endl;

return 0;
}
 
int bb(char a, char b)
{

cout<<"功能2"<<endl;

cout<<b<<endl;

cout<<a<<endl;

return 0;

}

void main()
{

A a;

a = ss;

a('a','b');

a = bb;

a('a', 'b');
}

2.比较二:

typedef int (A) (char, char);

void main()
{

A *a;

a = ss;

a('a','b');

a = bb;

a('a','b');
}

两个程序的结果都一样:

功能1

a

b

功能2

b

a

*****以下是参考部分*****

参考自:http://blog.hc360.com/portal/personShowArticle.do?articleId=57527

typedef 与 #define的区别:

案例一:

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

typedef char *pStr1;

#define pStr2 char *;

pStr1 s1, s2;

pStr2 s3, s4;
在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们

所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一

个类型起新名字。

案例二:

下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?

typedef char * pStr;

char string[4] = "abc";

const char *p1 = string;

const pStr p2 = string;

p1++;

p2++;

是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的

文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和

const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类

型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数

据类型为char *的变量p2为只读,因此p2++错误。虽然作者在这里已经解释得很清楚了,可我在这个地方仍然还是糊涂的,真的希望哪位高手能帮忙指点一下,特别是这一句“只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已”,难道自己定义的类型前面用const修饰后,就不能执行更改运算,而系统定义的类型却可以?

相关文章:

开发板tftp:timeout问题

想要从PC上面tftp文件的时候遇到了tftp:timeout的问题&#xff1a; >: tftp -gr gprsapp 192.168.1.38tftp: timeout 检查了网络&#xff0c;可以ping的通PC。PC的tftp服务器也已经打开了&#xff0c;测试从开发板上面向PC上tftp传送数据也是可以的&#xff1a;说明开发板上…

选择适合页面或应用程序的数据查看机制

根据您选择在 Web 窗体页显示数据的方式&#xff0c;在便利和性能之间常常存在着重要的权衡。例如&#xff0c;DataGrid Web 服务器控件可能是一种显示数据的方便快捷的方法&#xff0c;但就性能而言它的开销常常是最大的。在某些简单的情况下&#xff0c;您通过生成适当的 HTM…

Android强制设置横屏或竖屏

全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏 横屏 …

免费直播:1小时带你体验Python车牌识别实战

Python基础学会了&#xff0c;实战又是爬虫&#xff1f;太枯燥&#xff1f;别无聊&#xff0c;CSDN学院邀请章秀淞老师开设技术直播课&#xff1a;1小时带你体验车牌识别实战。让你从众多车中&#xff0c;能用Python技术找到夏树上的那辆叔叔的奔驰车牌&#xff08;玩笑&#x…

centos上tensorflow一键安装脚本

鉴于tensorflow在centos上安装相当麻烦,特地制作了一个脚本方便以后移植到其它机器上,脚本含有其它python常用包: #! /bin/bash sudo yum install -y gcc g gtk-devel libjpeg-devel libtiff-devel jasper-devel libpng-devel zlib-devel cmake unzip sqlite-devel readline-…

谷歌AI专家爆料:90%的人都不知道,写不出好代码,是输在了这点上!

工作压力大、大牛实力碾压&#xff0c;、外行人的偏见......2020年&#xff0c;程序员的心很累&#xff01;而Python和AI的初学者&#xff0c;心更累&#xff01;最近几年&#xff0c;我看过市面上很多 Python和人工智能的教程和书籍&#xff0c;它们大都这样讲&#xff1a;先从…

只要可能,就缓存数据和页输出

ASP.NET 提供了一些简单的机制&#xff0c;它们会在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据。另外&#xff0c;通过设计要进行缓存的页和数据请求&#xff08;特别是在站点中预期将有较大通讯量的区域&#xff09;&#xff0c;可以优化这些页的性能。与…

系统基本安全优化

1、删除系统特殊的的用户帐号和组帐号&#xff1a; userdel adm userdel lp userdel sync userdel shutdown userdel halt userdel news userdel uucp userdel operator userdel games userdel gopher groupdel adm groupdel lp groupdel news groupdel uucp groupdel games gr…

VMware12中安装CentOS7.2的详细过程

标签&#xff1a;Linux 虚拟机 CentOS1.什么是虚拟机虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。流行的虚拟机软件有VMware(VMWare ACE&#xff09;、Virtual Box和Virtual PC&#xf…

对于广泛依赖外部资源的应用程序,请考虑在多处理器计算机上启用网络园艺

ASP.NET 进程模型帮助启用多处理器计算机上的可缩放性&#xff0c;将工作分发给多个进程&#xff08;每个 CPU 一个&#xff09;&#xff0c;并且每个进程都将处理器关系设置为其 CPU。此技术称为网络园艺。如果应用程序使用较慢的数据库服务器或调用具有外部依赖项的 COM 对象…

深耕智能制造和超高清视频领域,思谋科技获数千万美元融资

6月29日&#xff0c;思谋科技对外宣布完成数千万美元Pre-A轮融资&#xff0c;由IDG资本领投&#xff0c;真格基金和联想创投跟投。据悉&#xff0c;本轮融资主要用于基于AI技术的智能制造、超高清视频等系统产品研发、人才招聘和市场拓展。 思谋科技成立于2019年12月&#xff…

[转] JavaScript仿淘宝智能浮动

转载自: http://www.williamlong.info/archives/2864.html 我们经常在淘宝网看到这样的特效&#xff0c;商品列表特别长&#xff0c;而商品列名称始终保持在最顶端。如果你把滚动条滚动至最上边了&#xff0c;那么它会自动判断是否到顶端了&#xff0c;然后一直置顶从而不怕遮挡…

《高效团队开发工具与方法》

一直以来都在用所谓的敏捷开发&#xff0c;但是也只是简单的说&#xff0c;用什么用什么&#xff0c;从开始感觉不方便&#xff0c;到后来感觉习惯了&#xff0c;可没有考虑过到底能带来什么改变&#xff0c;所以最近在上下班的地铁上在看完了《高效团队开发工具与方法》&#…

java image filters[02]-过滤器初探

图片缩放应用比较多&#xff0c;我们看看imageFilters提供的ScaleFilter怎么完成这项工作。 首先了解怎么调用过滤器&#xff0c;实例代码如下&#xff1a; public void imageScale(String fromPath, String toPath, int width, int height)throws IOException {// 定义“缩放过…

一定要禁用调试模式

在部署生产应用程序或进行任何性能测量之前&#xff0c;始终记住禁用调试模式。如果启用了调试模式&#xff0c;应用程序的性能可能受到非常大的影响。

Java“拍了拍”你,面试其实没那么难...

后疫情时代&#xff0c;连程序员这个多金的职业也遭受到了一定程度的打击。从各大招聘网站和多次面试经历中&#xff0c;相信大家已经意识到&#xff0c;面试官对程序员技能体系和项目经验考核似乎更严苛了。你在面试中常常为什么苦恼呢&#xff1f;简历撰写&#xff1f;数据算…

单据自动转换并审核的方法示例

需求要点&#xff1a;在单据A的界面点击“自动转换”&#xff0c;则自动产生审核态的单据B&#xff1b;若单据B不满足审核条件&#xff0c;则维持“提交”态&#xff1b;若单据B不满足保存校验&#xff0c;则维持“暂存”态&#xff1b;若转换失败&#xff0c;给出界面提示。实…

优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要

默认情况下&#xff0c;ASP.NET 配置被设置成启用最广泛的功能并尽量适应最常见的方案。因此&#xff0c;应用程序开发人员可以根据应用程序所使用的功能&#xff0c;优化和更改其中的某些配置&#xff0c;以提高应用程序的性能。下面的列表是您应该考虑的一些选项。 仅对需要的…

3年编程经验无名校背景,全栈小哥是如何拿下Twitter Offer的?

作者 | zhiachong责编 | Aholiab头图 | CSDN 下载自视觉中国出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;外国小哥zhia是个有面试绝技的人&#xff0c;他只有三年的编程经验&#xff0c;并且没有任何名牌大学的光环&#xff0c;两年多以前&#xff0c;他同时获得…

Sco Unixware 7.1.3企业版服务器安装视频教程

Sco Unixware 7.1.3企业版服务器安装视频教程 UnixWare 7.1.3是最先进的工业标准Intel和AMD处理器系统运行平台。UnixWare 7.1.3是关键业务解决方案的可靠基础&#xff0c;具备可伸缩性、可靠性、安全性突出和物美价廉的特点。其中UnixWare 7.1.3企业版为中高端数据库服务器及应…

牛!Python 也能实现图像姿态识别溺水行为了!

作者 | 李秋键责编 | Carol封图 | CSDN 下载自视觉中国众所周知随着人工智能智能的发展&#xff0c;人工智能的落地项目也在变得越来越多&#xff0c;尤其是计算机视觉方面。所以今天我们也是做一个计算机视觉方面的训练&#xff0c;用python来判断用户溺水行为&#xff0c;结合…

Asp.net中多项目共享Session

1. 建立一个空白解决方案blank solution&#xff0c;如&#xff1a;d:/MyProject/MyProject.sln 2. 在d:/MyProject下建一个Web Application的根目录d:/MyProject/WebMis并设为http://localhost/WebMis的虚拟目录 3. 在WebMis目录下根据模块分别新建目录&#xff0c;如&#xf…

JQuery模板插件jquery.tmpl-动态ajax扩展

在上一篇JQuery模板插件-jquery.tmpl中介绍了这款插件。有时我们需要去动态的ajax去加载模板&#xff0c;或者数据&#xff0c;根据url参数或者其他信息加载不同的模板&#xff0c;数据。在我的某个项目中有这个需求&#xff0c;所以特地写成jquery工具函数&#xff0c;加入了本…

《JAVA-枚举》

2019独角兽企业重金招聘Python工程师标准>>> 枚举&#xff1a;枚举在C/C/c#/java中&#xff0c;是一个被命名的整型常数的集合&#xff0c;枚举在日常生活中很常见。 表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,就是一个简单的例子 既然讲了枚…

在ASP.NET中使用WINDOWS模式登录SQL数据库

作者&#xff1a;未知 请作者速与本人联系经常发现有用户使用WINDOWS模式登录SQL SERVER&#xff0c;结果失败&#xff0c;提示&#xff1a; 用户 KEKC/ASPNET 登录失败。 说明: 执行当前 Web 请求期间&#xff0c;出现未处理的异常。请检查堆栈跟踪信息&#xff0c;以了解有…

时髦而精巧的Iphone墙纸收集

Iphone5如此的流行&#xff0c;我觉得我们有必要为我们的读者收集一套时尚的iphone墙纸。 知道设计和开发社区是多么喜欢装饰他们的移动设备&#xff0c;我们收集了各大社区最好的iphone墙纸&#xff0c;帮助你更好的装饰你的iphone设备。 因为有如此多的墙纸设计&#xff0c;我…

谷歌排名第一的编程语言,死磕它这两点,小白也能学的会!不信你看!

谷歌排名第一的编程语言时什么&#xff1f;毫无疑问&#xff1a;肯定是 Python。也难怪&#xff0c;作为大数据时代和人工智能时代的必备语言&#xff0c;Python 的优点太多了&#xff0c;语言简洁、易学、开发效率高、可移植性强......另外&#xff0c;更牛的地方是目前最热门…

UVA11059 Maximum Product

问题链接&#xff1a;UVA11059 Maximum Product。基础级练习题&#xff0c;用C语言编写程序。 题意简述&#xff1a;输入n个整数序列&#xff0c;有正有负&#xff0c;求这个序列中最大连续累乘的子序列&#xff0c;其最大的值为多少。如果结果为负数&#xff0c;则输出0。 问题…

.NET代码的保护

1没有绝对的保护 加密和破解都相对的 2用vs2002/2003/开发的代码 删除.cs/.vb文件只留 .dll和.aspx可以达到加密若要加密.aspx 可以把.aspx代码写入.csvs2005 beta1可以连.aspx都打包 3但是 dll还可以被反编译 所以高级的是加入混淆器不过这样也不是绝对的还是可以反编译混淆…

走向DBA[MSSQL篇] 面试官最喜欢的问题 ----索引+C#面试题客串

对大量数据进行查询时,可以应用到索引技术。索引是一种特殊类型的数据库对象&#xff0c;它保存着数据表中一列或者多列的排序结果&#xff0c;有效地使用索引可以提高数据的查询效率。大家面试初级、中级或者高级程序员的时候应该大部分都会被问到这样一些问题&#xff0c;你了…