typedef、define

define、inline、typedef的使用及需要注意的地方 阅读详情

这段时间总是在与C/C++打交道,主要是跨平台数据的传输。

C++一般使用结构体定义数据,小结一下 typedef、define。

下面这篇文章来自:http://developer.51cto.com/art/201104/256060.html,稍加改动。

typedef 和 define 的详细区别

typedef是C语言语句,其功能是用户为已有数据类型取“别名”。 

例如: 

typedef int INTEGER;  
  

这以后就可用INTEGER来代替int作整型变量的类型说明了,如:  

INTEGER a, b;   

用 typedef 定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。

例如: 

typedef int a[10];//表示a是整型数组类型,数组长度为10。 

然后就可用a说明变量,如:

a s1,s2;//完全等效于:int s1[10],s2[10] ; 

同理 typedef void (*p)(void) 表示 p 是一种指向 void 型的指针类型!
#define是预处理中的宏定义命令,例如:

#define int PARA  

表示在源程序中的所在 int 将会被 PARA 原样代替! 
如:程序中有 int a,b ;则在编译前将被替换为 PAPA a,b;

#define成了预编译指令,typedef当成语句处理。typedef和 define 都可以用来给对象取一个别名,但是两者却有着很大不同。

1. 首先,二者执行时间不同

关键字typedef在编译阶段有效,由于是在编译阶段,因此 typedef 有类型检查的功能。

define 则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

#define用法例子: 

#define f(x) x*x  
main( )  
{  
    int a=6,b=2,c;  
    c=f(a) / f(b);  
    printf("%d \n",c);  
} 

程序的输出结果是: 36,根本原因就在于 #define 只是简单的字符串替换,应当加个括号“((X)*(X))”。即:

#define f(x) (x*x)  
main( )  
{  
    int a=6,b=2,c;  
    c=f(a) / f(b);  
    printf("%d \n",c);  
} 

这样,结果就是9.

2. 功能不同

typedef 用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能。 如:

typedef int (*PF) (const char *, const char *); 

定义一个指向函数的指针的数据类型PF,其中函数返回值为 int,参数为 const char *。

typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以i获得最高的精度:

typedef long double REAL; 

在不支持 long double 的机器上,该 typedef 看起来会是下面这样:

typedef double REAL; 

并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:

typedef float REAL; 

#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

3. 作用域不同

#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用, 而 typedef 有自己的作用域。

void fun()   
{   
    #define A int   
}  
void gun()   
{   
    //在这里也可以使用A,因为宏替换没有作用域,   
    //但如果上面用的是typedef,那这里就不能用A ,不过一般不在函数内使用typedef  
} 

4. 对指针的操作

二者修饰指针类型时,作用不同。

Typedef int * pint;  
#define PINT int *  
Const pint p;//p不可更改,p指向的内容可以更改,相当于 int * const p;  
Const PINT p;//p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;  
pint s1, s2; //s1和s2都是int型指针  
PINT s3, s4; //相当于int * s3,s4;只有一个是指针。 

其实,typedef 和 define 末尾的标号也是不一样的,希望大家不要忽略这一点。通过本文的分析,相信你已经了解了这两者之间的区别。掌握了区别之后,运用起来会更加的灵活。

这篇博客 http://www.cnblogs.com/stli/archive/2010/12/02/1894890.html 写的很好。

等保2.0下可信验证的动态实现与合规实践 本文深入解读等保2.0标准中的“可信验证”要求,并重点探讨其动态实现与合规实践。文章阐述了从可信根、信任链到动态验证的核心概念,拆解了不同安全等级的实施差异,并提供了从硬件选型、软件赋能到平台集成的四步落地指南。通过行业案例与避坑心得,为构建覆盖计算环境、区域边界、通信网络和安全管理中心的全链条可信防御体系提供了实用参考。 阅读详情

相关推荐

用树莓派搭建全功能NAS服务器(01):树莓派基础操作&OMV搭建

写在前面 对于文件互传来说,局域网和云盘的操作总是独立的,而且很难将两者的优势合为一体。如果想要集多种优势为一体,那么NAS应该就是较为完美的解决方案了。 在这个系列中我们尽量跳过一些枯燥的理论知识,专注于说明两件事:   1.NAS是什么&能做什么 2.搭建思路&怎么做   这中间也会涉及到一些方案的选择,同类方案我也会列出来和大家分享我已知的优缺点,有兴趣可以多种尝试。(侧重于软件) 虽然是用树莓派搭建的,但是对于debian linux系统下的NAS搭建有着很好的参

斯塔克家的真维斯的工作间 2万+

跨平台的时候,一定要用typedef定义数据类型

跨平台的时候,一定要用typedef定义数据类型 不同的程序运行平台所支持的数据类型会有少许区别,采用typedef方便跨平台移植 例如:平台 A 64位数据类型为long double ,而平台 B64位数据类型为long double, 若想程序运行于平台A,则在程序之前申明 typedef long double REAL 若想移植到平台B,则只需更改typedef dou...

IVY_DAN的博客 720

【水文】calico-node 启动失败 Init:CrashLoopBackOff

Defaulted container "calico-node" out of: calico-node, upgrade-ipam (init), install-cni (init), mount-bpffs (init) Error from server (BadRequest): container "calico-node" in pod "calico-node-4j7td" is waiting to start: PodInitializing

大健的日常的博客 1万+

typedef的四个用途和两个陷阱

转自:赤龙的BLOG 用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb;  // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量;以下则可行:typedef char* PCHAR;  // 一般用大写PCHAR pa, pb;        // 可行,同时声明了两个指向字符变量的指针虽然:c

烂笔头的专栏 1511

V.PhyloMaker实战:从物种列表到维管束植物系统发育树的完整流程

本文详细介绍了使用V.PhyloMaker工具包,从物种列表快速构建维管束植物系统发育树的完整实战流程。内容涵盖R包安装、物种名标准化、核心函数phylo.maker的三种构建方案选择、结果树的可视化与导出,以及与picante包的联动分析,为生态学和生物地理学研究提供了高效解决方案。

weixin_29057237的博客 375

手把手教你用scATAC-seq分析拟南芥根尖染色质可及性(附代码实战)

本文详细介绍了使用scATAC-seq技术分析拟南芥根尖染色质可及性的完整流程,涵盖从实验设计、数据质控、细胞分群到差异分析和多组学整合的实战步骤。通过具体的代码示例,帮助植物研究者掌握单细胞表观组学分析的核心方法,揭示细胞异质性和基因调控动态。

weixin_29291185的博客 265

typedef的用法

typedef的用法 第一、四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然: char *pa, *pb; 也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,

qingtu11的博客 6970

【网络安全】零基础入门网络安全劝退指北

作为从16年接触网络安全的小白,谈谈零基础如何入门网络安全,有不对的地方,请多多指教。 这些年最后悔的事情莫过于没有把自己学习的东西积累下来形成一个知识体系。 后续我也会陆续的整理网络安全的相关学习资料及文章,与大家一起探讨学习。 如何入门 简单了解网络安全 网络安全就是指的确保网络系统中的数据不被别人破坏,而网安工程师就是涉及程序来维护网络安全。 网安方向有很多职位,比如安全产品工程师,安全分析师,数据恢复工程师,网络架构工程师,安全编程工程师,以及网络集成工程师等。 工作内容主要包括: 安全评测,风

互联网老辛 4585

typedef的使用详解

typedef的使用详解

weixin_54534636的博客 6502

主题035:计算流体力学(CFD)

计算流体力学(Computational Fluid Dynamics, CFD)是利用数值方法求解流体流动、传热传质等问题的学科。CFD已成为化学反应工程中反应器设计和优化的重要工具。∂ρ∂t+∇⋅(ρu)=0 \frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{u}) = 0 ∂t∂ρ​+∇⋅(ρu)=0对于不可压缩流动:∇⋅u=0 \nabla \cdot \mathbf{u} = 0 ∇⋅u=0动量方程:∂(ρu)∂t+∇⋅(ρ

kkchenjj的博客 267

Python 爬虫实战:网站反爬机制绕过终极指南(技术原理 + 实战代码 + 避坑技巧)

在 Python 爬虫的世界里,反爬机制是每一个爬虫开发者都必须面对的挑战。网站为了保护自身数据不被恶意爬取,会设置各种反爬机制,这使得爬虫开发变得更加复杂和有趣。本文将详细介绍常见的网站反爬机制及其绕过方法,结合技术原理、实战代码和避坑技巧,帮助你成为一名优秀的爬虫开发者。

u014481728的博客 1005

typedef用法总结笔记

本文主要介绍了typedef的多种用法 强调内容使用typedef可以为已由语言定义的类型和对你已经声明的类型构造更段或者更有意义的名称,而且利用typedef封装名称可以减少部分define定义带来的错误。与class, sturct union, enum声明不同, typedef不会引入新类型 -只是引入现有类型的新名称。 使用 typedef声明的名称将占用与其他标识符相同的命名空间(

学习ing 5432

多模态论文笔记——BLIP

本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。

haopinglianlian的博客 2454

【C语言】typedef与define的区别

在C语言中,typedef和define是两个常用的关键字,用于为数据类型和预处理宏定义起别名。然而,它们在作用范围、处理方式和类型安全性等方面存在一些重要的区别。本文将详细介绍typedef和define的区别,帮助读者更好地理解并正确使用它们。

Goforyouqp的博客 1万+

【雷达】正弦调频(SFM)信号应用于雷达和无线通信附Matlab代码.rar

1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

基于单片机的土壤湿度检测仪的硬件设计.pdf

基于单片机的土壤湿度检测仪的硬件设计.pdf

typedef和define有什么区别

typedef和define都是替一个对象取一个别名,以此增强程序的可读性,区别如下: (1)原理不同 #define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。 typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读

赵凯月的博客 7547

ComfyUI/FluxRedux OOTD蒙版基础换装

文件编号:c0023ComfyUI使用教程、开发指导、资源下载:https://datayang.blog.youkuaiyun.com/article/details/145220524AIGC工具平台Tauri+Django开源ComfyUI项目介绍和使用https://datayang.blog.youkuaiyun.com/article/details/146316250更多工具介绍项目源码搭建介绍:《我的AI工具箱Tauri+Django开源git项目介绍和使用》https://datayang.blog.youkuaiyun.com/article/details/146156817图形桌面工具使用教程:《我的AI工具箱Tauri+Django环境开发,支持局域网使用》https://datayang.blog.youkuaiyun.com/article/details/141897682

Typedef和define的区别

Typedef和define都可以用来给对象取一个别名,但是两者却有着很大不同。1. 首先,二者执行时间不同关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。Define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。 #define用法例子:#define f(x) x*xmain(

飞雪专栏 4475

基于DA算法的FIR数字滤波器的FPGA设计.pdf

基于DA算法的FIR数字滤波器的FPGA设计.pdf

define 与typedef的区别

define 与typedef大体功能都是使用时给一个对象取一个别名,增强程序的可读性,但它们在使用时有以下几点区别: 1.定义不一样 define定义后面不用加分号,并且它的别名在对象的前面 typedef需要加分号,并且它的别后面替换对象的前面 2.原理不一样 #define是预处理中的宏定义命令,在预处理时进行简单的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错,例如: 对于第二个输出,我们想要的是(5+1)*6=36,但是宏只是进行了简单的替换5+.

小程的博客 2万+

typedef和define的区别、typedef的具体用法

define这里为什么报错呢?是因为#define integer int*只能声明一个指针i,对第二个j是个int类型的数据,相当于int *i,j;所以变量j不能赋值一个地址,即会报错。unsigned integer会使代码报错,原因是typedef只能对数据类型进行整体封装,不能局部封装,所以当你想要对unsigned int类型进行取别名时,只能整体取。typedef最核心的用法:给数据类型取别名,这个别名既可以是此数据类型的替换,也是指向此数据类型的指针。

lxwyyds的博客 2593

C++中define和typedef有什么区别和联系

C/C++中#define和typedef的核心区别:#define是预处理阶段的文本替换,无类型检查,作用域直至文件结束,调试信息难追踪;typedef是编译阶段的类型别名,具有类型安全,遵循变量作用域规则,调试更直观。typedef更适合定义复杂类型和指针,而#define适用于条件编译和常量定义。C++11的using可作为typedef的现代替代方案。建议优先使用typedef或using保证类型安全,仅对简单文本替换使用#define。

学无止尽,谨言慎行! 1048

细说c++中 define 和 typedef

对于一个初学者来说,感觉这define 和 typedef 是等价的,其实不然。首先我们要树立这个观念 1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:#define PI 3.1415926程序中的:area=PI*r*r 会替换为3.1415926*r*r如果你把#defin

zhaowenchaofang的专栏 1170

C语言复习 —— const define typedef

1. const 关键字 2. define 宏定义 3. typedef的用法 3.1 typedef和const结合的陷阱 3.2 define和typedef的区别 3.3 typedef与结构体的练习

不善挽留 802

define和typedef

参考:【C++】define 和typedef 的详细区别define与typedef区别与联系 #define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。 typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能,它是...

de657982713的博客 155

define与typedef

很多同学对define很熟,对typedef也很熟,但是当define和typedef相遇的时候,就犯迷糊了。那么,define和typedef到底是什么关系?它们之间的区别在哪里?它们各自的含义是什么呢?请看下文     1、typedef  意思是重定义类型,它就相当于给较长的类型起一个简短的易懂的别名,就相当于在生活中你给你朋友起一个你认为好听又好记的小名,以后的称呼就是这个小名。例如,我

yqy_yangqingyu的博客 418

c语言中define和typedef的区别

c语言中define和typedef的区别 define只是简单的文本替换, typedef是声明一种新的类型,等同自带的基本类型。 它们完全是两个东西,是由不同的“程序”处理的: #define是宏,处理的时候位于编译前阶段,宏处理器基本上对你的C/C++程序不会有任何的感知。它只处理宏的语法。而编译阶段的“程序”得到的是宏处理完的结果。 typedef是编译阶段的一部分。它的意义是单一的。 用宏来定义类型,只是它恰好替换完字符串,可以达到那样的效果。但没有任何措施能够阻止你用它干别的事情。

撼沧 924

c++ define与typedef的区别

define和typedef的区别 Typedef和define都可以用来给对象取一个别名,但是两者却有着很大不同。 1、二者执行时间不同 关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。 Define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。 define用法例子: #define f(x) x*x main( ) {  int a=6,b=2,c;  c=f(a) / f(b);  printf("%d //

qq_41180633的博客 268

typedef 和define

/相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。// 这多数不符合我们的意图,它只声明了一个指向字符变量的指针和一个字符变量;不是的,它实际上相当于char* const。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。定义一种类型的别名,而不只是简单的宏替换。typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。//同时声明了两个指向字符变量的指针。#define 简单的文本替换,在。

m0_61973119的博客 174
上一篇: Android 资源国际化问题(3): 不同像素的手机
下一篇: Spinner(3): OnItemSelectedListener 触发时机
veryitman
博客等级 码龄16年 472粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值