C++那些细节--typedef关键字

2023-05-16

一.简介

关于typedef关键字,以前刚刚学C语言的时候,用它来重定义结构体别名。之后的话就是在用函数指针的时候用过一些,然而并不知道这个还有什么用处。今天花点时间总结一下typedef的细节。
在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异。简单来说,就是用来给一个复杂变量定义一个好记一点的名字。另外,使用typedef可以简化一些复杂的声明。

二.typedef的用途

1.定义类型别名,而不是简单的替换

typedef的第一个功能是定义类型的别名,比如Int*,比较麻烦,我们可以直接定义成pINt代表int型指针。而这种typedef
// C++Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

//typedef与#define的区别:
typedef int* TPINT;
#define DPINT int*

int _tmain(int argc, _TCHAR* argv[])
{
	int a = 1, b = 2;
	//使用typedef的TPINT,两个都是指针
	TPINT tpa, tpb;
	tpa = &a;
	tpb = &b;
	cout<<"a by pointer: "<<*tpa<<" b by pointer: "<<*tpb<<endl;

	//使用#define的只是简单的替换,第二个并不是pointer
	//这句话相当于int *dpa, dpb;
	//dpb是int类型的变量!!!
	DPINT dpa, dpb;
	dpa = &a;
	dpb = b;
	cout<<"a by pointer: "<<*dpa<<"b by value: "<<dpb<<endl;

	system("pause");
	return 0;
}
结果:
a by pointer: 1 b by pointer: 2
a by pointer: 1b by value: 2
请按任意键继续. . .
这里,使用typedef的话,所有定义的TPINT都是int*类型的,而#define仅仅是在编译的时候,将DPINT替换成了int*,后面的变量dpb就变成了int类型!!!所以,还是typedef靠谱一点!

2.定义平台无关类型

我们知道,编译宏可以很好的控制编译流,我们在编译跨平台程序的时候,很多时候是靠编译流的。编译流一般都是一些宏定义来控制。其他功能免不了用#define,但是类型定义有更好的typedef,所以关于类型的定义,我们完全可以使用typedef来替换#define
比如,在一些机器上,int为16位,long为32位,那么我们可以这样定义:
typedef int INT16
typedef long INT32
但是,有的机器上变成short位16位,int 32位,long变成了64位,那么我们如果想要运行的话,只能用short和int了,而我们使用了typedef,就可以很轻易的改typedef,而完全不需要大改项目:
typedef short INT16
typedef int INT32

3.为复杂声明定义一个简单的别名

typedef可以为复杂声明定义一个简单的别名,比如:
我们要定义一个装着MyObj对象的list,那么,每次定义的时候都要写出:
std::list<MyObj> objList;
但是,如果有typedef的话,就可以省去不少麻烦:
typedef std::list<MyObj> ObjList;
ObjList objlist;
不过,最明显的还是在用函数指针的时候。看一个例子:
不用typedef时,定义函数指针是介个样子滴:
// C++Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

//函数
void testfunc(int x)
{
	cout<<"x = "<<x<<endl;
};



int _tmain(int argc, _TCHAR* argv[])
{
	//定义一个函数指针
	void (*pfunc1)(int x);
	void (*pfunc2)(int x);
	pfunc1 = testfunc;
	pfunc2 = testfunc;
	pfunc1(1);
	pfunc2(2);

	

	system("pause");
	return 0;
}
这个函数目前只有一个参数,看起来都够麻烦了,那么如果有一大堆的参数,简直不忍直视!!!
而typedef闪亮登场之后:
// C++Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

//函数
void testfunc(int x)
{
	cout<<"x = "<<x<<endl;
};

//使用typedef来重命名函数指针
typedef void (*pFunc)(int x);

int _tmain(int argc, _TCHAR* argv[])
{
	//这下定义一个函数指针就简单多啦!!!
	pFunc pfunc1;
	pFunc pfunc2;
	pfunc1 = testfunc;
	pfunc2 = testfunc;
	pfunc1(1);
	pfunc2(2);

	

	system("pause");
	return 0;
}
结果:
x = 1
x = 2
请按任意键继续. . .
有了typedef,定义一个函数指针就像定义一个Int变量那样简单粗暴!!!

4.辅助声明结构体

这个在C++中是不需要的,而且貌似C语言也不需要了。老版本的C编译器可能会需要使用typedef来辅助定义结构体。
typedef struct tpoint
{
int x;
int y;
}Point;
Point pt;

三.typedef的注意事项

1.typedef重新定义类型别名,而非简单替换

看一个例子,关于const的。
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

#define DPINT int*
typedef int* PINT;

int _tmain(int argc, _TCHAR* argv[]) 
{

	
	int i1 = 2;
	int i2 = 3;
	const PINT pi1 = &i1;
	const PINT pi2 = &i2;
	const DPINT pi3 = &i1;
	
	//pi1 = &i2;这句是错误的,因为pi1整体为一个数据类型,Int*,即指针本身为const。
	//而指针指向的内容却是可变的
	*pi1 += 3;
	//对于pi3,为单纯的替换,即const int* pi3,此处const为底层const,修饰int*所指向的内容。所以指针本身是可以修改指向的
	pi3 = &i2;
	
	system("pause");
	return 0;
}

还是使用#define和typedef作对比。使用const PINT时,表示的是类型本身是const,而与类型的指向没关系,类型指向仍然是可变的。这点与#define正好不同!!

2.不能与存储类型关键字同时使用

typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性。
比如我们将typedef和static一起定义的话:
就会出现错误。
参考链接:
http://www.cnblogs.com/charley_yang/archive/2010/12/15/1907384.html
http://baike.baidu.com/link?url=dFIZ8bpYOr1oPz3yD7fph16lhmB-BRgDryDk3TrA9HtUQAvDWI8-23Nq1GFODhjuMSpAuckfhcYqU4l1iR92m_
http://blog.sina.com.cn/s/blog_5e8facd20100qfpn.html
http://www.cnblogs.com/ggjucheng/archive/2011/12/27/2303238.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++那些细节--typedef关键字 的相关文章

随机推荐

  • C++中4种方式把字符串和数字连接起来

    以前老用Java里面的String类 xff0c 用过的人都知道好舒服 xff0c 连接字符串和数字只需要用一个 43 号就可以了 在这里真的想把C 43 43 中string类 43 号功能加强一下 希望有能力的人可以做一下 xff0c
  • ROS系列教程一:工作空间及功能包创建

    前言 分享一下ROS开发的基础教程 xff0c 全部自己手敲 xff0c 希望能帮到正在学习的你 ROS在WIKI上也有教程 xff0c 个人觉得太过臃肿 xff0c 可以简化点 xff0c 毕竟大家都赶着投胎 xff0c 哈哈哈哈哈 一
  • 【算法技巧】数组连续子集操作---滑动窗口使用

    题目 已知一个数组arr 61 5 2 7 4 3 6 xff0c 求长度为k的连续连续子集和中最大值 解题思路 想法1 首先是比较容易想到的思路 xff0c 即利用双层循环进行遍历 xff0c 代码如下 xff1a span class
  • 【Pytorch】加载torchvision中预训练好的模型并修改默认下载路径(使用models.__dict__[model_name]()读取)

    说明 使用torchvision model加载预训练好的模型时 xff0c 发现默认下载路径在系统盘下面的用户目录下 xff08 这个你执行的时候就会发现 xff09 xff0c 即C 用户名 cache torch checkpoint
  • 【Pytorch】tensor索引另一个tensor(tensor[tensor])

    说明 最近在使用pytorch中tensor的时候 xff0c 遇到了需要使用tensor1 tensor2 的情况 xff0c 发现了这篇博客 xff0c 他从代码的角度解释了其工作原理 xff0c 这里我用图示的方式解释tensor类型
  • 【deepstream】deepstream调用opencv(c与c++联合编译)

    目的 在deepstream项目中调用opencv库 xff0c 丰富deepstream功能 xff08 如往deepstream加入kalman filter实现跟踪 xff09 操作环境 Ubuntu 18 04Qt Creatot
  • pycharm不能导入不同文件夹下的自定义模块

    文件目录结构如下所示 xff1a span class token operator span A1 span class token operator span span class token operator span B1 span
  • 【力扣】654. 最大二叉树

    题目概述 原题链接 相关节点定义 xff1a span class token comment Definition for a binary tree node struct TreeNode int val TreeNode left
  • 【力扣】114. 二叉树展开为链表

    题目概述 原题链接 树定义如下 xff1a span class token comment Definition for a binary tree node struct TreeNode int val TreeNode left T
  • 【力扣】725. 分隔链表

    题目概述 原题链接 链表定义如下 xff1a span class token comment Definition for singly linked list struct ListNode int val ListNode next
  • Angular应用开发中遇到的问题

    记录在开发Angular应用时遇到的问题以及解决方案 问题 3 前提 xff1a 在Angular应用的组件中使用响应式表单进行数据校验 xff0c 使用FormBuilder服务的 group 方法来构建一组FormControl实例 需
  • 浏览器插件解决跨域问题

    浏览器插件解决跨域问题 在前端进行调试时 xff0c 经常会遇到CORS问题 xff0c 在调试时 xff0c 可暂时使用浏览器插件解决跨域问题 浏览器 xff1a Microsoft Edge 插件搜索截图如下 xff1a 插件开启后 x
  • 洛谷P1591 阶乘数码(C语言)简单易懂

    题目描述 求 n n 中某个数码出现的次数 输入格式 第一行为 t t leq 10 t t 10 xff0c 表示数据组数 接下来 t 行 xff0c 每行一个正整数 n n leq 1000 n n 1000 和数码 aa 输出格式 对
  • 将java项目发布到maven中央仓库(踩坑大全)

    前言 xff1a 第一次将构件发布到中央仓库 xff0c 真的不是一件轻松的事情 xff0c 网络上有很多其他文章大都不会把坑帮你描述清楚 所以觉得非常有必要把些步骤记下来 xff0c 让大家少走点弯路 一 maven中央仓库简介 相关内容
  • IOS-----手动创建Main界面

    1 删除info plist中的Main设置 2 创建MainViewController h 和MainViewController m xff08 1 xff09 布局界面 xff1a UIViewController instance
  • 【转载+修改】通过ssh 转发 X 图形界面

    转载自 xff1a http linux chinaitlab com administer 742586 html 过程精简如下 xff1a 1 配置你要链接到的机器的sshd 在 etc ssh sshd config 中将 Allow
  • [已解决]IDEA各文件类变成灰色的处理方法

    这是我遇到的问题 xff0c 创建好一个工程后 xff0c 各文件类变成了灰色 大概总结网上所说的的原因和处理方法 xff0c 可能是由于pom xml没有成功被解析 解决方法一 xff1a 右键点击这个pom文件 xff0c 选择将其添加
  • ubuntu安装opencv的正确方法

    本文介绍的是如何安装ubuntu下C 43 43 接口的opencv 1 安装准备 xff1a 1 1安装cmake sudo apt get install cmake 1 2依赖环境 sudo apt get install build
  • Ubuntu16.04升级 Ubuntu18.04

    Ubuntu16 04升级 Ubuntu18 04 1 更新资源 sudo apt get update sudo apt get upgrade sudo apt dist upgrade 2 安装update manager core
  • C++那些细节--typedef关键字

    一 简介 关于typedef关键字 xff0c 以前刚刚学C语言的时候 xff0c 用它来重定义结构体别名 之后的话就是在用函数指针的时候用过一些 xff0c 然而并不知道这个还有什么用处 今天花点时间总结一下typedef的细节 在计算机