【C语言笔记】#define与typedef的区别
1、#define
define是预处理指令,在编译时不进行任何检查,只进行简单的替换
宏定义的一般形式为:
#define 宏名 字符串
这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。
2、typedef
typedef是在C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
typedef取别名的一般形式为:
typedef  旧名字  新名字
3、define与typedef的区别
(1)#define之后不带分号,typedef之后带分号。
(2)#define可以使用其他类型说明符对宏类型名进行扩展,而 typedef 不能这样做。如:
#define INT1 int
unsigned INT1 n;  //没问题
typedef int INT2;
unsigned INT2 n;  //有问题
INT1可以使用类型说明符unsigned进行扩展,而INT2不能使用unsigned进行扩展。
(3)在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。如:
#define PINT1 int*;
P_INT1 p1,p2;  //即int *p1,p2;
typedet int* PINT2;
P_INT2 p1,p2;  //p1、p2 类型相同
PINT1定义的p1与p2类型不同,即p1为指向整形的指针变量,p2为整形变量;PINT2定义的p1与p2类型相同,即都是指向 int 类型的指针。
下面看一个关于typedef的重要的问题!!请看代码:
#include <stdio.h>
typedef char *pStr;
int main(void)
{
	char string[4]="abc";  	//第一行代码
	const char *p1=string;  //第二行代码
	const pStr p2 = string; //第三行代码
	p1++;          			//第四行代码
	p2++;            		//第五行代码 
	return 0;
}
这段代码编译会报一个错误:error: increment of read-only variable 'p2',你知道问题出在哪吗?
答案与解析:
是第五行代码p2++出错了。这个问题提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和pStr const p2本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。
因此,const pStr p2的含义是:限定数据类型为char 的变量p2为只读,即为char const p2,表明p2是一个指向char类型的常指针,所以p2是不可修改的,因此p2++错误。
顺便提一下关于const声明的一些例子及其含义:
const int a;     //①
int const b;     //②
const int *c;    //③
int * const d;   //④
int const * e const;  //⑤
①a是常数,不可改变;
②b是常数,不可改变;
③c是一个指向整型常数的指针,指针可以变,指针指向的内容不可以变;
④d是一个指向整型变量的常指针,指针不可以变,指针指向的内容可以变;
⑤e是一个指向整型常数的常指针,指针与指针指向的内容都不可变。
我的个人博客:https://zhengnianli.github.io/
我的微信公众号:嵌入式大杂烩
【C语言笔记】#define与typedef的区别的更多相关文章
- define和typedef的区别
		define和typedef的区别 define是单纯的字符替换,typedef是重新定义了新的类型 #include <stdio.h> #define CHAR1 char* type ... 
- C++ —— 非类中使用const定义常量的初始化,以及#define和typedef的区别
		总结一下在非类中使用const关键字定义常量时的初始化问题,亲测VS2015.顺便记录#define宏和typedef的区别. 1 首先对const声明的常量的初始化做简单小结: , w2 = , w ... 
- #define 和typedef的区别
		typedef和define的详细区别 2011-04-19 15:11 firnow firnow 字号:T | T 对于都可以用来给对象取一个别名的Typedef和define来说,是有区别的.本 ... 
- 宏定义#define和typedef的区别和典型范例题目辨析
		宏定义#define pStr char* ,是直接把程序中出现pStr的地方替换成char* ,直接替换: typedef char * pStr; 是给char*定义一个别名叫做 pStr; ... 
- Linuxc - define 与 typedef的区别
		预处理就是讲一些头文件展开. 预处理还会将使用到宏定义的值替换为真正的值.宏只是单纯的字符串的替换. #define 宏定义 眼里没有语法,不用分号结尾. typedef 定义别名,是有语法的,要用分 ... 
- define与typedef的区别
		define: 发生在预处理阶段,也就是编译之前,仅仅文本替换,不做任何的类型检查 没有作用域的限制 typedef: 多用于简化复杂的类型声明,比如函数指针声明:typedef bool (*fun ... 
- #define与typedef
		#define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名), ... 
- c语言define和typedef区别和使用
		define完全可以理解替换,typedef代表别名.听着差不多的意思,那2者区别在哪? 先来个简单例子查看基本使用. //define和typedef区别 #define DB double //替 ... 
- typedef和#define的用法与区别
		typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程 ... 
随机推荐
- webhook 自动部署代码
			前话: 一般情况,自己在本地开发,代码改动后要push放到线上去看效果,但是我们还要到线上环境手动拉取代码库 git pull 下来, 一来一回太麻烦了. 现在用webhook就可以实现本地开发,pu ... 
- MySQL5.7初始化后5种密码重置方法
			前言:由于好几次安装MySQL5.7后一直被重置密码所困扰,因此特意整理重置的方法 安装MySQL5.7 [root@node1 db]# ll 以下的rpm安装包可以随处下载 total 40235 ... 
- jsp学习:jsp学习阶段性总结2019.9.21
			Jsp学习 jsp语法格式: 脚本程序:<% 代码片段 %> jsp声明:<%! declaration; [ declaration; ]+ ... %> 表达式:<% ... 
- NPOI 导出添加批注功能
			这个问题在网上搜,都是说如下即可: //添加批注HSSFPatriarch patr = (HSSFPatriarch)sheet.CreateDrawingPatriarch();HSSFComme ... 
- (三)Spring 高级装配 bean的作用域@Scope
			1.默认情况下,spring通过@Autowared注入的bean是单例的bean,但有些情况是不满足的,例如:购物车,每个会话,或每个用户登录使用的购物车都是独立的 spring的定义的作用域: a ... 
- python最基本的数据掌握
			python初学者可能会对list数据类型和int或者是字符串数据类型比较迷茫 list是引用,是指向的一个内存地址, 变量不是引用的 啥也不说上解释: a = 1 b = a a = 2 prin ... 
- 一个selenium简单案例自动添加数据
			//本来想着用execl来录入数据的,但是为了尽快完成所以直接搞了个数组 package aldtest; import org.openqa.selenium.*; import org.openq ... 
- 基于Docker搭建大数据集群(二)基础组件配置
			主要内容 jdk环境搭建 scala环境搭建 zookeeper部署 mysql部署 前提 docker容器之间能免密钥登录 yum源更换为阿里源 安装包 微云分享 | tar包目录下 JDK 1.8 ... 
- RecyclerView实现Gallery画廊效果
			使用RecyclerView实现一个画廊效果,主要是使用support库中最新加入的PagerSnapHelper类,通过计算滑动偏移来计算scale的值. 基本实现 首先需要为RecyclerVie ... 
- grep 命令使用
			grep是Linux中最常用的"文本处理工具"之一,用于在文本中查找指定的字符串. 语法: grep [OPTION]... PATTERN [FILE]... 参数: -i:在搜 ... 
