C++ typedef详解

2023-05-16

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;
    PCHAR pa,pb;
    pa = "hello";
    pb = "hello";//正常
    pb = 'h';//报错,不能将char类型的值赋给PCHAR类型实体
    return 0;
}

可以看出,typedef char* PCHAR;之后,PCHAR是char* 类型的别名,
PCHAR pa,pb;将pa,pb都定义成char* 类型。

2)定义struct结构体别名
我们知道,当声明一个结构体对象时,必须要带上struct,
格式为:struct 结构体名 对象名;
如下例所示:

struct tagPOINT1
{
    int x;
    int y;
};
struct tagPOINT1 p1;

当我们用typedef定义struct的别名后,可以直接用 别名 对象名 来声明一个对象
如下例所示:

typedef struct tagPOINT1
{
    int x;
    int y;
}POINT;
POINT p1;

3)用typedef来定义与平台无关的类型。
比如,某一平台支持int类型,而不支持long类型。
则可以使用typedef定义一个支持类型的别名,程序中使用该别名声明变量。
这样,我们使用极小的修改,typedef int REAL; 就可以实现类型的平台无关性

标准库中广泛使用了这个技巧。

4)为复杂的声明定义一个简单的别名
如:typedef int (*A) (char, char);
A是我们定义的别名,表示的是一个指向函数的指针,
该函数有两个char类型的参数,返回一个int类型的值。
则A类型的对象可以指向任何符合上述规则的函数。
如下例所示:

#include<iostream>
using namespace std;
typedef int (*A)(char,char);
int fun0(char a,char b);
int fun1(char a,char b);
int main()
{
    A a;
    a = fun0;
    a('a','b');
    a = fun1;
    a('a','b');
    return 0;
}
int fun0(char a,char b)
{
    cout<<"fun0"<<endl;
    return 0;
}
int fun1(char a,char b)
{
    cout<<"fun1"<<endl;
    return 0;
}

输出结果:
fun0
fun1

typedef和#define的区别

由前面的讲解,我们知道typedef和#define有本质的区别。
typedef是一种类型别名,而#define只是宏定义。二者并不总是可以互换的
如下例所示:

typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;

其中s1, s2, s3是char*类型,而s4是char类型。

typedef需要注意的事项

我们看一下下面的示例:

typedef char* pStr;
const char* p1 = "hello";
const pStr p2 = "hello";
p1++;//正常
p2++;//报错

p1和p2都是常量指针,意思是指针指向的内容不能修改,而指针是可以修改的。
那为什么p1++正常,而p2++报错呢。
对于p1++,我们不用再解释了,因为常量指针是可变的。
p2是我们定义的别名,而不是系统固有类型,编译器在编译时,会认为p2是常量,不可修改,
所以p2++会报错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ typedef详解 的相关文章

随机推荐

  • gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)

    首先祭出官网文档链接 xff1a https docs gitlab com omnibus settings smtp html 其实官网已经说的很清楚了 xff0c 并且给出了QQ邮箱的范例 xff08 BAT还是屌的 xff09 1
  • 文本编辑器Notepad++使用技巧

    除了语法高亮 xff0c 一般不用操作 还有两点经常使用的 xff1a 正则表达式查找替换和列模式编辑 这些可以在VS Eclipse Word等里也有 xff0c 但是有时打开一个文件就慢了 本来想总结记录一下技巧的 xff0c 却无意中
  • linux系统磁盘block、inode占满处理

    1 磁盘的block占满 xff0c 查看命令 df vh 然后查看占用百分比 2 磁盘inode占满 xff0c 查看命令df ih 同样也是查看占用百分比 block占满处理办法 需要用到的命令如下 LL 列出当前目录下的文件 df v
  • Code::Blocks平台下Fortran的编译

    问题背景 xff1a 因为之前学习数值方法 xff0c 有用到Fortran的地方 xff0c 所以上网查了一些资料 关于Fortran语言的编辑器安装 xff0c 目前本人接触到的支持Fortran的编辑器有VisualStdio和Cod
  • powershell远程连接

    在Linux中 xff0c 我们可以使用安全的SSH方便的进行远程管理 但在Windows下 xff0c 除了不安全的Telnet以外 xff0c 从Windows Server 2008开始提供了另外一种命令行原创管理方式 xff0c 那
  • 2022年学习总结暨2023年规划

    2022年总结 2022年是我在C站的创作元年 xff0c 在第一年也收获了不少成就 xff0c 比如 Java领域新星创作者 发布100篇博文 拿到了C站的书包 吃到了C站的月饼 成功上榜了330 43 截止目前收获粉丝8600 43 在
  • 《Prometheus+Grafana 实践派》专栏介绍

    专栏名称 Prometheus 43 Grafana 实践派 专栏介绍 本专栏根据本公司统一监控落地实践编写 在该专栏您将学到 企业级监控的选型Prometheus的基础知识Grafana的基础知识快速搭建Prometheus 43 Gra
  • 泊松分布–计算概率分布的公式

    Probability Distributions play an important role in our daily lives We commonly use them when trying to summarise and ga
  • Prometheus 的介绍和安装

    介绍 Prometheus 是一个开源的监控和报警系统 最初由SoundCloud于2012年创建 随着越来越多的公司采用Prometheus以及非常活跃的社区 Prometheus于2016年加入云原生基金会 成为Kubernetes之后
  • 因为锁的问题,我们被扣了1万

    前言 春节放假期间 xff0c 一个项目上的积分接口被刷 xff0c 而且不止一个人在刷 xff0c 并且东西也被兑走 xff0c 放假晚上被人叫起来排查问题 xff0c 通过这个人的积分明细观察 xff0c 基本一秒就能获取一次 xff0
  • Prometheus 告警机制介绍及命令解读

    本文您将了解到Prometheus 告警模块Alertmanager的架构介绍 核心概念 命令解析和AMTool的基本使用 Prometheus的告警模块并不存在于Prometheus中 而是 以独立项目Alertmanager存在 Pro
  • Prometheus 告警模块配置深度解析

    本文您将了解到Prometheus 告警模块Alertmanager 配置的深度解析 Alertmanager 配置解析 Alertmanager 配置可以用命令行配置 也可以通过配置文件配置 命令行用来配置不可变的系统参数 配置文件用来定
  • 不会前端没事,用GWT Boot和Spring Boot构建Web程序

    本文介绍了一种使用Java构建Web应用程序的方式 xff0c 其中GWT或者J2CL是必不可少的 xff0c 另外还有多个UI框架可以配套使用 xff0c 比如Domino UI VueGWT GWT Material Design GM
  • Prometheus 监控云Mysql和自建Mysql(多实例)

    本文您将了解到 Prometheus如何配置才能监控云Mysql 包括阿里云 腾讯云 华为云 和自建Mysql Prometheus 提供了很多种Exporter 用于监控第三方系统指标 如果没有提供也可以根据Exporter规范自定义Ex
  • 2023年 Java 发展趋势

    GitHub 语言统计表明 xff0c Java在编程语言中排名第二 xff0c 而在2022年的TIOBE指数中 xff0c Java排在第四 抛开排名 xff0c Java是自诞生以来企业使用率最高的编程语言 xff0c 作为一种编程语
  • Spring Boot 中文参考指南(二)-Web

    Spring Boot 版本 2 7 8 原文 xff1a https docs spring io spring boot docs 2 7 8 reference htmlsingle Spring Boot 3 x 第一个 GA 版本
  • Java 编写Vue组件(VueGWT的初尝试)

    在之前 xff0c 我曾写过这样的文章 不会前端没事 xff0c 用GWT Boot和Spring Boot构建Web程序 xff0c 这篇文字使用的Domino UI来做前端页面 xff0c 由于现在更流行VUE xff0c 并且VUE的
  • Spring Boot 源码阅读初始化环境搭建

    在开始源码阅读之前 xff0c 需要先搭建一个简易的SSM环境用于测试 xff0c 这里不过解释怎么搭建 xff0c 相信都开始看源码了 xff0c 还不会搭建Demo环境就先去学习下基础 demo环境地址 xff1a https gith
  • python列表平均值函数_如何计算列表的平均值-统计信息和Python的均值函数详细解释

    python列表平均值函数 Mathematics and programming go hand in hand If you are a programmer at some point you will have to use mat
  • C++ typedef详解

    typedef的用途 1 定义一种类型的别名 注意typedef并不是简单的宏替换 xff0c 如下例所示 xff1a span class token keyword int span span class token function