C++ typedef

2023-05-16

一、介绍

typedef为C++的关键字,作用是为一种数据类型定义一个新名字。即

typedef  [type]  [new name].

在编程中使用typedef目的一般有两个,

一个是给变量一个易记且意义明确的新名字,

一个是简化一些比较复杂的类型声明。

二、用法

(1)用typedef声明一个新类型名来代替已有的类型名。如:

typedef int Status  //指定标识符Status代表int类型
typedef double DATE  //指定标识符DATE代表double类型

这样下面代码等价:

int i; double j;
Status i;DATE j;

(2)声明结构体

以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如:

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

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

tagPOINT1 p1;

估计某人觉得经常多写一个struct太麻烦了,于是就发明了:

    typedef struct tagPOINT  
    {  
        int x;  
        int y;  
    }POINT;  
    POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候  

(3)为复杂的声明定义一个新的简单的别名。

我们经常看到这样的写法

typedef void* (*GLADloadproc)(const char *name);
typedef int A[]; 

如果 使用typedef  [type]  [new name].就解释不清楚。让我们来看一下typedef的官方定义

Typedef does not work like typedef [type] [new name]. The [new name] part does not always come at the end.
You should look at it this way: if [some declaration] declares a variable, typedef [same declaration] would define a type.

总结一下就是: 在任何声明变量的语句前面加上typedef之后,原来是变量的都变成一种类型。不管这个声明中的标识符号出现在中间还是最后。所以,GLADloadproc是一种类型,它代表一个返回值为void*,参数为const char*的函数指针。

typedef int A[];  // 定义一个名为A的ints数组的类型
typedef int f(); // 定义一个名为f, 参数为空, 返回值为int的函数类型
typedef int g(int); // 定义一个名为g, 含一个int参数, 返回值为int行的函数类型

复杂的声明定义一个新的简单的别名的方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。

 原声明:

void (*b[10]) (void (*)());

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

typedef void (*pFunParam)();

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

typedef void (*pFunx)(pFunParam);

原声明的最简化版:

pFunx b[10];

理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完 

参考

C/C++ typedef用法详解(真的很详细)_Lee_Shuai的博客-CSDN博客_c++ typedef

C++typedef的详细用法_hai008007的博客-CSDN博客_c++ typedef

关于typedef的用法总结_iot-genius的博客-CSDN博客_typedef

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

C++ typedef 的相关文章

  • 获取当前类的typedef

    我目前正在将 boost intrusive ptr 与我的 GUI 类一起使用 虽然这或多或少是一个方便的问题 但是否有正确的方法来获取当前类的类型名 我问的原因是我有一个用于定义不同指针类型的宏 define INTRUSIVE PTR
  • Objective C:NSRange 或类似的 float?

    对于某些方法 我希望它们返回一定范围的值 从 235 到 245 我这样做是使用NSRange作为返回值 NSRange giveMeARangeForMyParameter NSString myParameter 只要返回值是一个就可以
  • 解释 qsort 库中使用的函数的 typedef

    我正在使用 qsort 库函数对结构元素数组进行排序 在互联网上搜索时我发现了一个资源 信息 使用 C qsort 函数对结构进行排序 support microsoft 我知道 qsort 函数需要通过通用指针进行类型转换 但是我无法得到
  • C++ extern 模板实例化和 typedef (gcc)

    我正在尝试在外部实例化模板 但是我想在实例化子句中使用 typedef 我认为这个例子说了一千多字 typedef myTemplate base
  • 带有限制关键字的 typedef

    我这样定义对齐浮动 typedef attribute aligned 64 float aligned float 然后我定义对齐的浮动restrict像这样的关键字 typedef aligned float restrict alig
  • 如何阅读 C 声明?

    我听说过一些方法 但没有一个能坚持下来 就我个人而言 我尝试避免 C 中的复杂类型 并尝试将它们分解为组件 typedef 我现在面临着维护一些来自所谓的 三星级程序员 的遗留代码 并且我很难阅读一些 代码 如何阅读复杂的 C 声明 本文解
  • 部分模板的 C++ typedef

    我需要做这样的 typedef template lt class A class B class C gt class X template lt class B class C gt typedef X lt std vector b
  • 如何让 Hibernate 调用我的自定义 typedef?

    我正在尝试定义 CompositeUserType 来处理 JPA Hibernate 应用程序中的特定类型 我有一个名为 ApplicationMessageType 的 CompositeUserType 旨在处理我的映射 根据我所读到
  • 在 cython 中使用 typedef'd 结构

    我在头文件 dcm h 中有以下定义 typedef struct double alpha double gamma double tau ThetaDCM 我想将它导入到 cython 中 所以我有 cdef extern from d
  • C: typedef 联合体

    在相关问题中没有找到任何内容 最有可能的是超级菜鸟 但我还是会问 我的 h 文件中有以下内容 typedef union API Packet 0x90 uint8 t packet 26 struct pack struct uint8
  • 函数原型 typedef 可以在函数定义中使用吗?

    我有一系列具有相同原型的函数 比如说 int func1 int a int b int func2 int a int b 现在 我想简化它们的定义和声明 当然我可以使用这样的宏 define SP FUNC name int name
  • 自引用结构定义?

    我写 C 的时间不长 所以我不确定应该如何做这些递归的事情 我希望每个单元格包含另一个单元格 但我在 字段 child 的类型不完整 行 这是怎么回事 typedef struct Cell int isParent Cell child
  • 在 C++ 中 typedef 数组与使用结构体

    发现了 typedef 的一个有趣的用法 但我确实认为没有必要 typedef int Color 3 那么使用将是 Color pants pants 0 0 etc 通过 ptr 使用 typedef 会创建看起来很奇怪且不清楚的代码
  • 在 Swift 中使用 obj-c typedef

    我有一个 typedef 如下 typedef NSString VMVideoCategoryType extern VMVideoCategoryType const VMVideoCategoryType MusicVideo ext
  • 污染全局命名空间

    我想这里的大多数 C 程序员都会同意污染全局命名空间是一个坏主意 但是有时这条规则可以被忽略吗 例如 我有一个需要在特定应用程序中使用的类型 我应该这样定义它 mytypes h typedef int MY TYPE foo cpp MY
  • 如何使用“typedef NS_ENUM”在一个 .h 文件中定义多个变量类型

    我用过typedef NS ENUM重新组织旧代码中的数据常量 使用方法在这里找到 https stackoverflow com a 42009056 2348597 every typedef被声明在一个单一的 h可以导入到项目中任何类
  • 了解 C 中函数指针的 typedef

    当我阅读其他人的代码时 我总是有点困惑 这些代码具有指向带有参数的函数的指针的 typedef 我记得不久前 当我试图理解用 C 编写的数值算法时 我花了一段时间才得到这样的定义 那么 您能否分享一下关于如何为函数指针编写良好的 typed
  • C Typedef 和 struct 问题

    这两种声明有什么区别 哪种声明优先于另一种 typedef struct IOPORT GPIO TypeDef port u16 pin IOPORT typedef struct GPIO TypeDef port u16 pin IO
  • 是否允许将类模板类型参数键入相同的名称?

    这似乎可以在 MSVC 中按预期编译甚至工作 但它是合法的 C 代码吗 它是否能保证执行此处所期望的操作 即将模板类型导出到结构体的同名用户 template
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set

随机推荐