c语言define和typedef区别和使用
define完全可以理解替换,typedef代表别名。听着差不多的意思,那2者区别在哪?
先来个简单例子查看基本使用。
//define和typedef区别
#define DB double //替换 define 被替换的内容 替换的内容
typedef double db; //别名 typedef 原来的类型名 新的别名
//typedef需要分号 ,typeof 去掉以后符合语法规则,define去掉就会报错 void main()
{
//看不出区别
DB d1 = 1.2,d2=1.8; //等价 double d1 = 1.2,d2=1.8;
db d3 = 1.9,d4=2.3; //等价 double d3 = 1.9,d4=2.3; printf("%f,%f",d1,d2);
printf("\n%f,%f",d3,d4); }
上面唯一看出的区别就是typedef需要分号。
通过指针变量来测试2者的区别
#define DP double *
typedef double * dp; void main2()
{
DP dp1,dp2; //DP是替换,等价 double *dp1,dp2; //dp1是指针占4个字节,dp2就是double类型数据8字节
dp dp3,dp4; //都是4字节的指针, 等价于 dobule *dp3,*dp4; printf("%d,%d", sizeof(dp1),sizeof(dp2)); //4,8
printf("\n%d,%d",sizeof(dp1),sizeof(dp2)); //4,4
}
通过上面例子可以看出define完全就是替换,typedef则不同。
最后简单说明下,利用利用define和typedef构建函数指针
void print(int num)
{
printf("时间%d",num);
} void main()
{
//函数指针
void(*p)(int num) = print;
p(10);
}
但是像上面第9行代码那样写多了会觉得很烦啊,可以使用define和typedef来构建
//typedef int* pint; //给int类型指针别名
typedef void(*p)(int num); //给函数指针类型别名 ,p是类型的别名
#define Pprint(X) void(*X)(int num) //带参数的宏模式 void main()
{
//函数指针 //利用typedef
p p1 = print;
p1(); //利用define
Pprint(p2) = print;
p2();
}
c语言define和typedef区别和使用的更多相关文章
- define与typedef 区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.例如:#define PI 3. ...
- #define与typedef区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.例如: #define PI 3.141 ...
- 【C语言笔记】#define与typedef的区别
1.#define define是预处理指令,在编译时不进行任何检查,只进行简单的替换 宏定义的一般形式为: #define 宏名 字符串 这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符 ...
- #define 和typedef的区别
typedef和define的详细区别 2011-04-19 15:11 firnow firnow 字号:T | T 对于都可以用来给对象取一个别名的Typedef和define来说,是有区别的.本 ...
- C++ #define,typedef,using用法区别
一.#define #define 是宏定义命令,宏定义就是将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替,是预编译命令,因此会在预编译阶段被执行 1.无参宏定义 无参宏的宏名 ...
- 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 const typedef
#define用法 1. 定义简单的常数:定义常量,便于修改 #define N 1000 2. 定义简单的函数:注意多使用括号 define可以像函数那样接受一些参数,如下: #define max ...
- #define与typedef
#define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名), ...
随机推荐
- python 安装psutil包报错:
报错: Failed building wheel for psutil Google得知,需要安装python-devel 和 wheel sudo dnf install python-devel ...
- ES6必知必会 (八)—— async 函数
async 函数 1.ES2017 标准引入了 async 函数,它是对 Generator 函数的改进 , 我们先看一个读取文件的例子: Generator 写法是这样的 : var fs = re ...
- 使用位图文本工具BMFont从图片生成自定义字体
bmfont工具如何使用 http://www.360doc.com/content/13/1206/12/14253074_334930801.shtml fnt各属性含义 http://www.2 ...
- DBUnit使用介绍
一.DbUnit设计理念熟悉单元测试的开发人员都知道,在对数据库进行单元测试时候,通常采用的方案有运用模拟对象(mock objects)和stubs两种.通过隔离关联的数据库访问类,比如JDBC的相 ...
- 监控操作系统的CPU、内存、磁盘
Linux 四大件:CPU.内存.磁盘.网络 CPU 就像人的大脑,主要负责相关事情的判断以及实际处理的机制. CPU的性能主要体现在其运行程序的速度上.影响运行速度的性能指标包括CPU的工作频率.C ...
- bzoj 4372 烁烁的游戏——动态点分治+树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 和 bzoj 3070 震波 是一个套路.注意区间修改的话,树状数组不能表示 dis ...
- Phonegap Android 项目使用Cordova
要在已经创建好的Android项目里,使用Cordova. 1. 首先在Android Studio中创建Android项目 2. 创建cordova项目 cordova crate test com ...
- hudson插件说明
Artifactory Plugin:maven仓库管理工具 Backup plugin 可以备份hudson_home下所有文件,除了svncode.这个插件有问题,不能使用. Build Publ ...
- Java 将字符串转换为字符数组 toCharArray()
Java 手册 toCharArray public char[] toCharArray() 将此字符串转换为一个新的字符数组. 返回: 一个新分配的字符数组,它的长度是此字符串的长度,它的内容被初 ...
- ROS+nfdump 用户上网日志
ROS 本身提供了 Traffic Flow 功能,与 Scisco的 Netflow 功能类似.只要开启 Traffic Flow 传到日志服务器即可, 这种设置系统开销很小,可以传到本地网络,也可 ...