typedef和define具体的详细区别

typedef和define具体的详细区别,第1张

区别如下:

(1)原理不同

#define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。

typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。

(2)功能不同

typedef用来定义类型的别名,起到类型易于记忆的功能。另一个功能是定义机器无关的类型。如定义一个REAL的浮点类型,在目标机器上它可以获得最高的精度:typedef long double REAL, 在不支持long double的机器上,看起来是这样的,typedef double REAL,在不支持double的机器上,是这样的,typedef float REAL

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

(3)作用域不同

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

(4)对指针的 *** 作不同

#define INTPTR1 int

typedef int INTPTR2;

INTPTR1 p1, p2;

INTPTR2 p3, p4;

含义分别为,

声明一个指针变量p1和一个整型变量p2

声明两个指针变量p3、p4

#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可以指向其他内容。

const INTPTR2 p2是一个指针常量,不可使p2再指向其他内容。因为INTPTR2表示一个指针类型,因此用const限定,表示封锁了这个指针类型。

INTPTR2 const p3是一个指针常量

扩展资料:

define的作用:

被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。

宏定义的作用范围仅限于当前文件,即file1c中定义 #define PI 314,在file2c中该宏定义不起作用;通过将#define PI 314定义在commonh中,file1c和file2c分别#include "commonh"的方式,该宏定义在file1c和file2c中都起作用。

在C或C++语言中,“宏”分为有参数和无参数两种。

参考资料:

typedef-百度百科

1、栈区的使用

栈区写入内存的的顺序是先进后出。

存放的是函数的参数、返回值、局部变量

由编译器管理数据开辟和释放

变量的生命周期在该函数结束后自动释放

不要返回局部变量的值,因为局部变量在函数执行之后就释放掉了,无法读取原来的内存

2、堆区的使用

堆区的空间远远大于栈区

它没有先进后出的数据结构

由程序员手动开辟和释放,malloc、calloc开辟free释放

注意:

如果主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中的指针分配内存

3数据区放的是静态变量、全局变量以及常量

static静态变量: 编译阶段分配内存,只能在当前文件内使用,只初始化一次

ertern全局变量:C语言下默认的全局变量前都默认隐藏了该关键字

4const修饰的变量

直接修改const修饰的全局变量:失败

简介修改const修饰的全局变量:失败,原因是放在常量区,受到保护

直接修改const修饰的局部变量:失败

直接修改const修饰的局部变量:成功,该局部变量其实放到了栈区,是伪常量

5字符串常量

不同编译器的处理方式有所区别

ANSI并未指定它的修改方式

有些编译器可以修改字符串常量,但有些不可以,某些编译器将相同的字符串常量看做同一个字符串常量

6void的使用方式

无类型,不可以创建变量,无法分配内存

限定函数返回值

限定函数参数列表

void是万能指针,不需要强制转化就可以给其他指针赋值

7sizeof的使用

sizeof的本质其实是一个运算符,类似于+-/

当统计某类型占的空间时需要加()

当统计mou变量占的空间时无需加()

返回值的类型是无符号整形,即unsigned int

数组名称如果作为函数参数,会退化为指针,指向数组首元素

8typedef的使用

它可以给类型起别名

简化struct关键字

区分数据类型

提高代码的可移植性

在C语言中,typedef是一种类型定义关键字,用于为现有的数据类型创建新的类型名。

使用typedef可以将现有的数据类型(如int,float,char等)重新命名为其他名称,或者用现有的数据类型定义新的数据类型。

下面是一个简单的示例,使用typedef将int类型重新定义为myint类型:

现在,可以使用myint代替int来声明变量或函数,例如:

这个定义和下面的定义是等价的:

typedef的主要优点是可以使代码更加清晰易懂,同时可以简化代码中的类型声明。在复杂的程序中,使用typedef可以使代码更加易读,因为可以将较长的数据类型名称缩短为更容易理解的名称。

类型定义。

它就和define相对应,define是把一个自己起的名字的常量定义为代替它的另一个常量来同。

typedef是把一个自己起的名字的类型用已经有的类型代替使用,如:typedef int Type1;之后如果有Type1 i ;系统则理解为int i;。

在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

扩展资料

define被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。

宏定义的作用范围仅限于当前文件,即file1c中定义 #define PI 314,在file2c中该宏定义不起作用;通过将#define PI 314定义在commonh中,file1c和file2c分别#include "commonh"的方式,该宏定义在file1c和file2c中都起作用。

在C或C++语言中,“宏”分为有参数和无参数两种。

#define GPEBLT_FUNCNAME(basename) (SCODE (GPE::)(struct GPEBltParms ))&GPE::##basename

在#define中,标准只定义了#和##两种 *** 作。#用来把参数转换成字符串,##则用来连接前后两个参数,把它们变成一个字符串。

输出为:token 9 = 10

详见百科typedef(相似)。

参考资料来源:百度百科-define

C语言中,使用typedef 定义一个函数指针类型的书写格式如下:

typedef  返回值类型   (函数指针类型名称)(参数列表);

为方便理解,下面在手机上使用易历知食软件内部的微C程序设计来编程,演示其定义方式,并写个测试函数,再通过函数指针来调用测试函数,在手机上的代码如下图(图截取自手机):

运行结果如下图:

以上就是关于typedef和define具体的详细区别全部的内容,包括:typedef和define具体的详细区别、C语言栈区、堆区的使用,typedef和sizeof的使用、有没有好心人能帮我解释一下这个typedef到底是啥啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9826208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存