typedef与define区别(#define uchar unsigned char与typedef unsigned char uchar;的区别)
本文目录
- #define uchar unsigned char与typedef unsigned char uchar;的区别
- typedef和define的区别
- 单片机中宏定义与重新定义数据类型(typedef)区别,并且各自的优势(初学单片机)
- #define 和typedef对于指针常量的定义
- define和typedefine有什么区别
- #define,typedef,sbit三个关键字分别是什么意思,举例说明
- #define uchar unsigned char与typedef unsigned char uchar;的区别
#define uchar unsigned char与typedef unsigned char uchar;的区别
#define uchar unsigned char是宏定义。也就是在预编译时期,编译器 把 程序中 的 uchar 作字符串 替代,把 uchar 替换成 unsigned char 后 再 编译整个程序。 typedef 是定义 一个新的 变量类型,类型名字叫 uchar. 或者说 给 原来的 unsigned char 类型 起了个 “外号”,书写时 显得简单 一点。 typedef 行 的 行尾 有分号,它属于 声明。#define 行 的 行尾 没有分号,它属于 宏,预编译命令。两者程序效果一样。 #define uchar unsigned char 的 宏 可以被 #undef uchar 取消typedef unsigned char uchar; 不能被取消。例如:#ifndef uchar#define uchar unsigned char#endifuchar u0=6;...#undef uchar // 可以取消定义... uchar u1=8; //取消后 uchar 就没有定义了。而 typedef 。。。不能被取消。
typedef和define的区别
typedef和#define的用法与区别一、typedef的用法在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:typedef int INT;typedef int ARRAY;typedef (int*) pINT;typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。二、#define的用法#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:#define INT int#define TRUE 1#define Add(a,b) ((a)+(b));#define Loop_10 for (int i=0; i《10; i++)在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。三、typedef与#define的区别从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量,到了C++,const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好,如#defineINT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的编译器又做了扩充。为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点代码的第三行:typedef (int*) pINT;以及下面这行:#define pINT2 int*效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;表示定义了一个整型指针变量a和整型变量b。typedef的四个用途和两个陷阱用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然: char *pa, *pb; 也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。 用途二: 用在旧的C代码中(具体多旧没有查),帮助struct。以前的代码中,声明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,比较省事,尤其在大量使用的时候 或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。 用途三: 用typedef来定义与平台无关的类型。 比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为: typedef long double REAL; 在不支持 long double 的平台二上,改为: typedef double REAL; 在连 double 都不支持的平台三上,改为: typedef float REAL; 也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。 标准库就广泛使用了这个技巧,比如size_t。 另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。 用途四: 为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例: 1. 原声明:int *(*a)(int, char*); 变量名为a,直接用一个新别名pFun替换a就可以了: typedef int *(*pFun)(int, char*); 原声明的最简化版: pFun a; 2. 原声明:void (*b) (void (*)()); 变量名为b,先替换右边部分括号里的,pFunParam为别名一: typedef void (*pFunParam)(); 再替换左边的变量b,pFunx为别名二: typedef void (*pFunx)(pFunParam); 原声明的最简化版: pFunx b; 3. 原声明:doube(*)() (*e); 变量名为e,先替换左边部分,pFuny为别名一: typedef double(*pFuny)(); 再替换右边的变量e,pFunParamy为别名二 typedef pFuny (*pFunParamy); 原声明的最简化版: pFunParamy e; 理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例: int (*func)(int *p); 首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。 int (*func)(int *); func右边是一个结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。 也可以记住2个模式: type (*)(....)函数指针 type (*)数组指针 --------------------------------- 陷阱一: 记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如: 先定义: typedef char* PSTR; 然后: int mystrcmp(const PSTR, const PSTR); const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。 原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。 简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。 陷阱二: typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如: typedef static int INT2; //不可行 编译将失败,会提示“指定了一个以上的存储类”。
单片机中宏定义与重新定义数据类型(typedef)区别,并且各自的优势(初学单片机)
1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。 2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。 3)typedef比#define更安全。举个例子: typedef char* pStr1; #define pStr2 char * pStr1 s1, s2; pStr2 s3, s4; 在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。
#define 和typedef对于指针常量的定义
#define是宏,是在预编译阶段做的文本替换,#define INTPTR1 int*那么预编译时首先将代码中所有的INTPTR1替换成int*再编译。const INTPTR1 p1=&a将被替换成const int* p1=&a,因此p1被定义为一个常量指针。而typedef是关键字,作用是定义一种新的类型。typedef int* INTPTR2是告诉编译器现在有一种新类型叫INTPTR2,这个类型和int*等价,也就是一个整型指针。const INTPTR2 p2=&b,表示定义一个INTPTR2类型的常量p2,由于INTPTR2是指针类型,INTPTR类型的常量自然就是指针常量。因此p2被定义为一个指针常量。
define和typedefine有什么区别
区别:define只是简单的替换,而tpyedef 是一种类型定义\r\n有 #define DEFPCHAR char*\r\n typedef char* TPYEPCHAR;\r\n如果 DEFPCHAR a, b;\r\n那么是直接展开宏为 char* a, b;//a为char*型,b是为char型\r\n如果是TPYEPCHAR a, b;\r\n那么类型定义的结果为 char*a, *b;//同为char*型\r\n明白了么
#define,typedef,sbit三个关键字分别是什么意思,举例说明
define是宏定义,就是替换的意思,他定义的是集合,是整个IO口typedef就是对数据类型的代替,如typedef unsigned int u32就是用u32代替无符号型整数,使用时就是u32 变量,就可以了。sbit是特殊功能寄存器的一个位声明,如,sbit led P2∧0,定义的是具体的位变量。
#define uchar unsigned char与typedef unsigned char uchar;的区别
区别:define只是简单的替换,而tpyedef是一种类型定义有第一定要说不通举个例子#defineDEFPCHARchar*typedefchar*TPYEPCHAR;如果DEFPCHARa,b;那么是直接展开宏为char*a,b;这里只有a背定义成了指针而b成了char!!!!如果是TPYEPCHARa,b;他们都是指针了
更多文章:
龙腾世纪2和龙腾世纪1哪个更好玩点?龙腾世纪1觉醒 可玩性如何
2023年11月19日 00:00
爱又米信用额度是什么 如何领取爱又米信用额度?爱又米是什么软件
2024年7月9日 06:24
工人物语6下载(给个工人物语6中文硬盘版的下载地址,最好要游侠网的)
2023年5月2日 06:00
植物大战僵尸2巨浪海滩(中文版植物大战僵尸2有巨浪海滩世界吗)
2024年5月18日 08:52
手机街机模拟器(打不开街机模拟器,只显示“不能初始化DirectSound”,怎么办)
2024年5月10日 21:09