C语言中typedef的用法有哪些?

typedef的用法有:1、为基本数据类型定义新的类型名;2、为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称;3、为数组定义简洁的类型名称;4、为指针定义简洁的名称。

C语言中typedef的用法有哪些?

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。

一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。

例如,C 语言在 C99 之前并未提供布尔类型,但我们可以使用 typedef 关键字来定义一个简单的布尔类型,如下面的代码所示:

typedef int BOOL;#define TRUE 1#define FALSE 0

定义好之后,就可以像使用基本类型数据一样使用它了,如下面的代码所示:

立即学习“C语言免费学习笔记(深入)”;

BOOL bflag=TRUE;

typedef的4种用法

在实际使用中,typedef 的应用主要有如下4种。

1、为基本数据类型定义新的类型名

也就是说,系统默认的所有基本类型都可以利用 typedef 关键字来重新定义类型名,示例代码如下所示:

typedef unsigned int COUNT;

而且,我们还可以使用这种方法来定义与平台无关的类型。比如,要定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型,即:

typedef long double REAL;

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

typedef double REAL;

甚至还可以在连 double 都不支持的平台三上,改为:

typedef float REAL;

这样,当跨平台移植程序时,我们只需要修改一下 typedef 的定义即可,而不用对其他源代码做任何修改。其实,标准库中广泛地使用了这个技巧,比如 size_t 在 VC++2010 的 crtdefs.h 文件中的定义如下所示:

#ifndef _SIZE_T_DEFINED#ifdef  _WIN64typedef unsigned __int64    size_t;#elsetypedef _W64 unsigned int   size_t;#endif#define _SIZE_T_DEFINED#endif

2、为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称

以结构体为例,下面我们定义一个名为 Point 的结构体:

struct Point{    double x;    double y;    double z;};

在调用这个结构体时,我们必须像下面的代码这样来调用这个结构体:

struct Point oPoint1={100,100,0};struct Point oPoint2;

在这里,结构体 struct Point 为新的数据类型,在定义变量的时候均要向上面的调用方法一样有保留字 struct,而不能像 int 和 double 那样直接使用 Point 来定义变量。现在,我们利用 typedef 定义这个结构体,如下面的代码所示:

typedef struct tagPoint{    double x;    double y;    double z;} Point;

在上面的代码中,实际上完成了两个操作:

1)、定义了一个新的结构类型,代码如下所示:

struct tagPoint{    double x;    double y;    double z;} ;

其中,struct 关键字和 tagPoint 一起构成了这个结构类型,无论是否存在 typedef 关键字,这个结构都存在。

2)、使用 typedef 为这个新的结构起了一个别名,叫 Point,即:

typedef struct tagPoint Point

因此,现在你就可以像 int 和 double 那样直接使用 Point 定义变量,如下面的代码所示:

Point oPoint1={100,100,0};Point oPoint2;

为了加深对 typedef 的理解,我们再来看一个结构体例子,如下面的代码所示:

typedef struct tagNode{    char *pItem;    pNode pNext;} *pNode;

从表面上看,上面的示例代码与前面的定义方法相同,所以应该没有什么问题。但是编译器却报了一个错误,为什么呢?莫非 C 语言不允许在结构中包含指向它自己的指针?

其实问题并非在于 struct 定义的本身,大家应该都知道,C 语言是允许在结构中包含指向它自己的指针的,我们可以在建立链表等数据结构的实现上看到很多这类例子。那问题在哪里呢?其实,根本问题还是在于 typedef 的应用。

在上面的代码中,新结构建立的过程中遇到了 pNext 声明,其类型是 pNode。这里要特别注意的是,pNode 表示的是该结构体的新别名。于是问题出现了,在结构体类型本身还没有建立完成的时候,编译器根本就不认识 pNode,因为这个结构体类型的新别名还不存在,所以自然就会报错。因此,我们要做一些适当的调整,比如将结构体中的 pNext 声明修改成如下方式:

typedef struct tagNode{    char *pItem;    struct tagNode *pNext;} *pNode;

或者将 struct 与 typedef 分开定义,如下面的代码所示:

typedef struct tagNode *pNode;struct tagNode{    char *pItem;    pNode pNext;};

在上面的代码中,我们同样使用 typedef 给一个还未完全声明的类型 tagNode 起了一个新别名。不过,虽然 C 语言编译器完全支持这种做法,但不推荐这样做。建议还是使用如下规范定义方法:

struct tagNode{    char *pItem;    struct tagNode *pNext;};typedef struct tagNode *pNode;

3、为数组定义简洁的类型名称

它的定义方法很简单,与为基本数据类型定义新的别名方法一样,示例代码如下所示:

typedef int INT_ARRAY_100[100];INT_ARRAY_100 arr;

4、为指针定义简洁的名称

对于指针,我们同样可以使用下面的方式来定义一个新的别名:

typedef char* PCHAR;PCHAR pa;

对于上面这种简单的变量声明,使用 typedef 来定义一个新的别名或许会感觉意义不大,但在比较复杂的变量声明中,typedef 的优势马上就体现出来了,如下面的示例代码所示:

int *(*a[5])(int,char*);

对于上面变量的声明,如果我们使用 typdef 来给它定义一个别名,这会非常有意义,如下面的代码所示:

// PFun是我们创建的一个类型别名typedef int *(*PFun)(int,char*);// 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*);PFun a[5];

小心使用 typedef 带来的陷阱

接下来看一个简单的 typedef 使用示例,如下面的代码所示:

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);

在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?

答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char*const(一个指向char的常量指针)”。即它实际上相当于“char*const”,而不是“const char*(指向常量 char 的指针)”。当然,要想让 const PCHAR 相当于 const char* 也很容易,如下面的代码所示:

typedef const char* PCHAR;int strcmp(PCHAR, PCHAR);

其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。

还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int INT_STATIC;

不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。

相关推荐:《c语言教程》

以上就是C语言中typedef的用法有哪些?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1434368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
详细解说C语言中的两种输出对齐方式(小白必看)
上一篇 2025年12月17日 09:54:07
C语言中main函数可以在什么位置
下一篇 2025年12月17日 09:54:34

相关推荐

  • VSCode怎么保存代码C_VSCode编写和保存C语言代码的注意事项教程

    答案:在VSCode中保存C语言代码需按Ctrl+S或Cmd+S,并确保文件以.c结尾;为实现高亮、格式化与调试,需安装C/C++扩展,设置语言模式为C,配置tasks.json编译、launch.json调试,安装clang-format实现保存时自动格式化,且确保GDB就位。 在VSCode中保…

    2026年8月30日
    100
  • 从零开始学习UCOSII操作系统1–UCOSII的基础知识

    大家好,我们又见面了,我是你们的朋友全栈君。 从零开始学习UCOSII操作系统1–UCOSII的基础知识 前言: 首先,比较主流的操作系统包括UCOSII、FREERTOS和LINUX等,其中UCOSII的资料相对丰富得多。 更重要的是,我目前还没有能力深入研究Linux操作系统。因此,本次学习UC…

    2026年8月29日
    200
  • 定时器(Timer)的底层实现

    定时器的底层实现依赖于操作系统的硬件计时器和软件调度机制:1. 硬件层面通过pit或apic等计时器触发中断,管理时间片和任务调度;2. 软件层面通过操作系统api(如linux的timer_create和timer_settime)与内核交互,实现定时器功能。 定时器(Timer)的底层实现到底是…

    2026年8月26日
    000
  • 如何编写Swoole的PHP扩展?

    编写swoole的php扩展需要c语言基础。1)准备开发环境,安装php和swoole源码。2)明确扩展目的,编写如custom_swoole_hello函数。3)注意环境依赖、swoole api、内存管理、调试、兼容性和线程安全。 你想知道如何编写Swoole的PHP扩展?嗯,这可是一个既有趣又…

    2026年8月26日
    000
  • java是c语言开发的吗 Java语言实现技术揭秘

    java 不是由 c++ 语言开发的,但受到了 c 和 c++ 的影响。java 的实现技术包括:1)虚拟机(jvm),将字节码转换为机器码,支持跨平台运行;2)标准库(java api),提供丰富功能和简洁语法;3)性能优化,如 jit 编译器和内存管理工具。java 是一个庞大而复杂的生态系统,…

    2026年8月26日
    000
  • C语言实现1到100累加

    C语言实现1到100累加C语言实现1到100累加C语言实现1到100累加C语言实现1到100累加

    本题难度较低,可通过循环结构实现累加计算,重点在于使用三种不同的循环语句完成相同功能。 1、 启动CodeBlocks开发环境,创建一个新项目以进行后续操作。 2、 选择C语言类型,并将项目命名为MaxNum,方便后期维护与识别。 3、 按照提示继续操作,直至项目创建成功。 立即学习“C语言免费学习…

    2026年8月25日 用户投稿
    000
  • 使用c语言编写wc命令——统计字符数、单词数、行数

    我们知道linux操作系统上有一个非常常用的命令,用来统计字符数、单词数以及行数的wc命令。今天,我们来尝试使用c语言来编写一个类似功能的程序(注:阅读本文需要一定的c语言基础)。 编写该程序时,需要掌握两个函数的用法,getchar()以及putchar()。 getchar用来从标准输入中读取一…

    用户投稿 2026年8月25日
    000
  • html5如何改成flash_HTML5替代Flash方案与迁移技巧【方法】

    需用HTML5替代Flash:一、Canvas/SVG重写动画图形;二、Video/Audio元素+Web Audio API替代音视频;三、WebSocket/Fetch重构通信;四、Emscripten将AS3转WebAssembly;五、Ruffle模拟器运行遗留SWF。 如果您正在处理一个原…

    2025年12月23日
    100
  • c语言如何生成html_用C语言程序输出HTML格式文件【文件】

    C语言动态生成HTML文件有五种方法:一、用fprintf逐行写入;二、构建缓冲区后fwrite一次性写入;三、用宏简化标签输出;四、从模板文件加载并替换变量;五、用结构体组织元素并序列化。 如果您希望使用C语言程序动态生成HTML格式的文件,则需要通过标准文件I/O操作将符合HTML语法的文本内容…

    2025年12月23日
    200
  • 怎么在HTML上运行C语言_HTML上运行C语言方法【教程】

    使用Emscripten将C代码编译为WebAssembly,通过emcc生成HTML和wasm文件,在浏览器中运行;2. 借助JS-Interpreter类库在前端模拟执行简单C代码,适用于教学场景;3. 通过WebSocket连接远程Linux终端,利用xterm.js和后端服务实现C程序的编译…

    2025年12月23日
    300
  • 怎么用c 运行html_C运行html方法【教程】

    可通过system函数调用系统命令打开HTML文件,如Windows下使用start命令,Linux用xdg-open,macOS用open;也可生成HTML内容写入临时文件后调用命令打开;还可使用CreateProcess(Windows)或fork/exec(Linux/macOS)等API更安…

    2025年12月23日
    200
  • 怎么在html里运行c程序_html中运行c程序方法【教程】

    可通过Emscripten将C编译为WebAssembly、调用在线编译API或结合Node.js后端执行C程序。首先推荐使用Emscripten工具链,将C代码(如hello.c)通过emcc命令编译成.wasm文件,并生成配套的HTML和JavaScript文件,在本地服务器运行即可在浏览器中执…

    2025年12月23日
    000
  • 怎么样用c语言运行html_c语言运行html方法【教程】

    C语言可通过三种方式处理HTML:1. 用fopen、fprintf生成静态HTML文件并保存;2. 编写HTTP服务器,通过套接字监听请求并返回HTML响应;3. 生成文件后调用system执行系统命令打开HTML预览。 如果您希望在C语言程序中处理或生成HTML内容,通常是因为需要创建动态网页内…

    2025年12月23日
    000
  • c 怎么运行html文件路径_C运行html文件路径方法【教程】

    答案:通过system()函数调用系统命令可打开HTML文件。一、使用system(“start 文件路径”)在Windows打开,Linux用xdg-open;二、动态拼接路径提高可移植性;三、生成临时HTML文件后自动打开。 如果您尝试在C语言程序中打开或运行HTML文件…

    2025年12月23日
    100
  • html怎么运行c_html中调用运行C语言方法【教程】

    可在HTML中通过三种方式调用C语言代码:一、用Emscripten编译为WebAssembly并在JS中调用;二、通过Node.js后端执行C可执行文件并返回结果;三、配置CGI使Web服务器直接运行C程序。 如果您希望在HTML中实现与C语言的交互,以调用C语言编写的函数或程序,需要借助特定技术…

    2025年12月23日
    300
  • 文本文档c语言怎么在html运行_文本文档c语言嵌入html运行法【技巧】

    可通过Emscripten将C代码编译为WebAssembly在HTML中运行,或嵌入JDoodle等平台的交互式编辑器实现在线执行,也可用Prism.js高亮代码并结合JavaScript模拟输出效果。 如果您希望在网页中展示C语言代码的运行效果,由于HTML本身无法直接执行C语言程序,必须借助外…

    2025年12月23日
    300
  • 解决Haskell CGI中因文件读取编码导致HTML输出截断的问题

    本文旨在解决Haskell CGI应用程序在Apache环境下,从文件读取数据生成动态HTML时,可能出现HTML输出截断的问题。核心原因在于CGI运行环境的默认语言环境(LANG=C)与文件内容编码(通常为UTF-8)不匹配,导致Haskell在读取文件时抛出无效字节序列错误。解决方案是通过显式设…

    2025年12月23日
    000
  • 解决Haskell CGI应用中文件读取导致的HTML输出截断问题

    本文旨在解决Haskell CGI应用程序在读取包含Unicode字符的文件时,通过Apache等Web服务器运行时可能出现的HTML输出截断问题。核心原因在于CGI环境默认的`LANG=C`导致编码不匹配。解决方案是利用`GHC.IO.Encoding.setLocaleEncoding utf8…

    2025年12月23日
    000
  • HTML5WebGL怎么入门_HTML5WebGL3D图形编程的基础知识与实例

    先掌握WebGL渲染管线原理并实践绘制三角形,再通过Three.js等库实现3D场景。1. 理解WebGL基于着色器的渲染机制,使用GLSL编写顶点和片元着色器。2. 初始化WebGL环境,编译着色程序,传入顶点数据并调用drawArrays绘制彩色三角形。3. 引入模型、视图和投影矩阵实现3D空间…

    2025年12月23日
    100
  • 将列表字典转换为扁平化值列表的Pythonic方法

    本文旨在介绍如何利用python的列表推导式,高效且简洁地将一个包含多个字典的列表,扁平化为一个只包含所有字典值的单一列表。通过详细的代码示例和解析,读者将掌握这一常用的数据处理技巧,提升代码的简洁性和执行效率。 在数据处理和分析的场景中,我们经常会遇到需要从复杂数据结构中提取特定信息的情况。其中一…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信