C/C++中的typedef和#define详解

发布时间 - 2026-01-10 23:18:24    点击率:

C/C++中的typedef和#define

前言:

     在C/C++中,我们平时写程序可能经常会用到typedef关键字和#define宏定义命令,在某些情况下使用它们会达到相同的效果,但是它们是有实质性的区别,一个是C/C++的关键字,一个是C/C++的宏定义命令,typedef用来为一个已有的数据类型起一个别名,而#define是用来定义一个宏定义常量。下面谈谈两者在实际使用中应当注意的地方。

1.typedef关键字

   typedef是用来声明类型别名的,在实际编写代码过程使用typedef往往是为了增加代码的可读性。它可以为一串很长的类型名起一个别名,那么使用这个别名可以达到与原类型名相同的效果。

    如:

typedef int INT;
typedef char CHAR;

就为int和char分别起了一个别名,那么在程序中使用INT a;和int a;达到的效果是等同的。在使用typedef时应注意一下几点:

 1)typedef是为一个数据类型起一个新的别名,如typedef int INT;那么要告诉我的是INT表示整型,typedef int* INTPTR;则告诉我们INTPTR是一个指向整型变量的指针类型,这点与#define是决然不同的,#define只是作简单的字符串替换,不表达任何含义。如:

#define INTPTR1 int*
typedef int* INTPTR2;

INTPTR1 p1,p2;
INTPTR2 p3,p4;

INTPTR1 p1,p2;和INTPTR2 p3,p4;这两句的效果决然不同。INTPTR1 p1,p2;进行字符串替换后变成int* p1,p2;要表达的意义是声明一个指针变量p1和一个整型变量p2;而INTPTR2 p3,p4;由于INTPTR2是具有含义的,告诉我们是一个指向整型数据的指针,那么p3和p4都为指针变量,这句相当于int* p1,*p2;从这里可以看出,进行宏替换是不含任何意义的替换,仅仅为字符串替换;而用typedef为一种数据类型起的别名是带有一定含义的。

    再看下面这个例子:

#define INTPTR1 int*
typedef int* INTPTR2;

int a=1;
int b=2;
int c=3;
const INTPTR1 p1=&a;
const INTPTR2 P2=&b;
INTPTR2 const p3=&c;

上述代码中,const INTPTR1 p1表示p1是一个常量指针,即不可以通过p1去修改p1指向的内容,但是p1可以指向其他内容;而对于const INTPTR2 p2,由于INTPTR2表示是一个指针类型,因此用const去限定,表示封锁了这个指针类型,因此p2是一个指针常量,不可使p2再指向其他的内容,但可以通过p2修改其当前指向的内容,INTPTR2 const p3同样声明的是一个指针常量。

2)对于宏定义:

#define INT int
unsigned INT a;

  这种用法是可行的;

typedef int INT;
unsigned INT a;

是绝对错误的用法。

2.#define宏定义

   #define是一个宏定义命令,用来定义一个常量(包括无参常量和有参常量),它本身并不在编译过程中执行,而是在预处理阶段就已经完成了,因此不作任何正确性检查,只进行不关含义的字符串替换。在使用宏定义时,如果稍不注意就会发生错误,而且这个错误往往是你意想不到的。如:

#define ADD(a,b) a+b

int i=1;
int j=2;
int k=3;
int s=ADD(i,j)*k;

程序可能想求算的是(i+j)*k的结果,然而这段程序并没有达到这种效果,由于宏替换只是进行简单的字符串替换,那么ADD(i,j)*k相当于i+j*k,并不是想象中的(i+j)*k。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C/C++中的typedef和#define  # C++中的typedef和#define详细介绍  # 详解C++中typedef 和 #define 的区别  # 如何区分C++中的inline和#define宏  # C++中const与#define的利弊分析  # C/C++中宏定义(#define)  # 浅谈C++/C关于#define的那些奇奇怪怪的用法  # 是一个  # 的是  # 整型  # 可以通过  # 告诉我们  # 就会  # 是在  # 告诉我  # 是有  # 在实际  # 是用来  # 其他的  # 有一定  # 这段  # 希望能  # 仅为  # 几点  # 它可以  # 可以看出  # 不含 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作大概多少钱一个,做一个平台网站大概多少钱?  微信小程序 wx.uploadFile无法上传解决办法  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  网站制作免费,什么网站能看正片电影?  微信小程序 五星评分(包括半颗星评分)实例代码  如何快速搭建高效服务器建站系统?  python中快速进行多个字符替换的方法小结  详解阿里云nginx服务器多站点的配置  如何在企业微信快速生成手机电脑官网?  Laravel如何实现多对多模型关联?(Eloquent教程)  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  如何在Windows 2008云服务器安全搭建网站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  详解Android中Activity的四大启动模式实验简述  b2c电商网站制作流程,b2c水平综合的电商平台?  如何快速辨别茅台真假?关键步骤解析  如何用wdcp快速搭建高效网站?  Android okhttputils现在进度显示实例代码  如何有效防御Web建站篡改攻击?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何用西部建站助手快速创建专业网站?  如何制作一个表白网站视频,关于勇敢表白的小标题?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  怎么用AI帮你设计一套个性化的手机App图标?  高端网站建设与定制开发一站式解决方案 中企动力  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  Laravel怎么上传文件_Laravel图片上传及存储配置  英语简历制作免费网站推荐,如何将简历翻译成英文?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  想要更高端的建设网站,这些原则一定要坚持!  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  如何在搬瓦工VPS快速搭建网站?  EditPlus中的正则表达式 实战(4)  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  JavaScript如何实现音频处理_Web Audio API如何工作?  如何用PHP工具快速搭建高效网站?  WEB开发之注册页面验证码倒计时代码的实现  高防服务器:AI智能防御DDoS攻击与数据安全保障  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程