C++ define的用法
#define是预处理指令,说到这里,我们有必要说一下C++常见的预处理指令:
#空指令,无任何效果
#include包含一个源代码文件
#define定义宏
#undef取消已定义的宏
#if如果给定条件为真,则编译下面代码
#ifdef如果宏已经定义,则编译下面代码
#ifndef如果宏没有定义,则编译下面代码
#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个#if……#else条件编译块
#error停止编译并显示错误信息
接下来详细介绍一下预处理指令#define的用法
1.define(无参数宏定义)用法
一般形式为:#define 标识符 字符串
- “#”表示其为预处理命令,凡是以“#”开头的都是预处理命令;“define”为宏定义命令;“标识符”为所定义的宏名;“字符串”可以是常数、表达式、字符串等。
- 除了经常用到的如“#define MAXNUM 100”之外,还有其它多种灵活的用法,如“#define M (y*y+3*y)”,注意,的表达式中()是必须的,否则在进行如“2*M+2”的运算 时就会出现错误。
- 末尾不需要分号(如果加分号,会连同分号一起代换)。
- define只是做简单的文本替换。
- 作用域为宏定义开始,到源程序结束,终止定义域可用“#undef M”。
- 宏名如果以字符串的形式被调用,则不做替换,如printf(“I M O”)。
- 可以嵌套进行定义,如:#define PI 3.14 #define S PI*R*R
- 习惯上把宏名写为大写的,以区别普通的变量。
2.define和typedef的区别
define宏定义是在预处理完成的,typedef实在编译时处理的,typedef不是简单的代换,而是对类型说明符的重命名。
例如:#define P1 int*
typedef int* P2;
P1 a, b;//相当于int* a, b,此时a是int指针,b是int整数。
P2 a, b;//表示a和b都是int指针。
3.define(带参数宏定义)用法
一般形式为:#define 宏名(形参) 字符串
最长见的 #define MAX(a,b) (a>b)?a:b
(1)宏名和形参之间不能有空格。如果上式写为 #define MAX (a,b) (a>b)?a:b,则MAX就表示整个后面的部分了。
(2)带参宏定义的形参是不分配内存的。
(3) 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
#define SQ(y) (y)*(y)
int main()
{int a,sq;printf("input a number: ");scanf("%d",&a);sq=SQ(a+1);printf("sq=%d\n",sq);return 0;
}
上例中第一行为宏定义,形参为y。程序第七行宏调用中实参为a+1,是一个表达式,在宏展开时,用a+1代换y,再用(y)*(y) 代换SQ,得到如下语句 :
sq=(a+1)*(a+1);
这与函数的调用是不同的,函数调用时要把实参表达式的值求出来再赋予形参。而宏代换中对实参表达式不作计算直接地照原样代换。
(4)在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中(y)*(y)表达式的y都用括号括起来,因此结果是正确的。如果去掉括号,把程序改 为以下形式:
#define SQ(y) y*y
int main()
{int a,sq;printf("input a number: ");scanf("%d",&a);sq=SQ(a+1);printf("sq=%d\n",sq);return 0;
}
运行结果为:
input a number:3
sq=7
(5)define的多行定义 define可以替代多行的代码,例如MFC中的宏定义 #define MACRO(arg1, arg2) do { / /* declarations */ / stmt1; / stmt2; / /* ... */ / } while(0) /* (no trailing ; ) */ 关键是要在每一个换行的时候加上一个"/"
4.define宏和函数的区别
(1)宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。 看一个例子,比较两个数或者表达式大小,首先我们把它写成宏定义: #define MAX( a, b) ( (a) > (b) (a) : (b) ) 其次,把它用函数来实现: int max( int a, int b) { return (a > b a : b) } 很显然,我们不会选择用函数来完成这个任务,原因有两个: 首先,函数调用会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。这种开销不仅会降低代码效率, 而且代码量也会大大增加,而使用宏定义则在代码规模和速度方面都比函数更胜一筹;其次,函数的参数必须被声明为一种特定的类型,所以它只能在 类型合适的表达式上使用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型的比较函数。反之,上面的那个宏定义可以用于整 形、长整形、单浮点型、双浮点型以及其他任何可以用“>”操作符比较值大小的类型,也就是说,宏是与类型无关的。 和使用函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码的拷贝都会插入到程序中。除非宏非常短,否则使用宏会大幅度增加程序的长 度。 还有一些任务根本无法用函数实现,但是用宏定义却很好实现。比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带参的宏。 看下面的例子:
#define MALLOC(n, type) ( (type *) malloc((n)* sizeof(type)))
利用这个宏,我们就可以为任何类型分配一段我们指定的空间大小,并返回指向这段空间的指针。我们可以观察一下这个宏确切的工作过程: int *ptr; ptr = MALLOC ( 5, int ); 将这宏展开以后的结果: ptr = (int *) malloc ( (5) * sizeof(int) ); 这个例子是宏定义的经典应用之一,完成了函数不能完成的功能,但是宏定义也不能滥用,通常,如果相同的代码需要出现在程序的几个地方,更好的 方法是把它实现为一个函数。
(2)下面总结和宏和函数的不同之处,以供大家写代码时使用,这段总结摘自《C和指针》一书。
代码长度 #define宏:每次使用时,宏代码都被插入到程序中。除了非常小的宏之外,程序的长度将大幅度增长 函数:函数代码只出现于一个地方:每次使用这个函数时,都调用那个地方的同一份代码 执行速度 #define宏:更快 函数: 存在函数调用、返回的额外开销
操作符优先级 #define宏:宏参数的求值是在所有周围表达式的上下文环境里,除非它们加上括号,否则邻近操作符的优先级可能产生不可预料的结果。 函数:函数参数只在函数调用时求值一次,它的结果值传递给函数。表达式的求值结果更容易预测。
参数求值 #define宏:参数用于宏定义时,每次都将重新求值,由于多次求值,具有副作用的参数可能会产生不可预测的结果。 函数:参数在函数调用前只求值一次,在函数中多次使用参数并不会导致多次求值过程,参数的副作用并不会造成任何特殊问题。
参数类型 #define宏:宏与类型无关,只要参数的操作是合法的,它可以用于任何参数类型。 函数: 函数的参数是与类型有关系的,如果参数的类型不同,就需要使用不同的函数,即使它们执行的任务是相同的。
#undef的作用是删除由#define定义的宏,使之不再起作用。
该指令的形式为
#undef 标识符
其中,标识符是一个宏名称。如果标识符当前没有被定义成一个宏名称,那么就会忽略该指令。
一旦定义预处理器标识符,它将保持已定义状态且在作用域内,直到程序结束或者使用#undef 指令取消定义。
C++ define的用法相关推荐
- typedef和#define的用法与区别
typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...
- C语言中#define的用法(转)
转自:http://www.dingge.com/main/article.asp?id=10 今天整理了一些#define的用法,与大家共享! 1.简单的define定义 #define MAXTI ...
- php中define的参数_php中define的用法有哪些
php中define的用法:1.[define()]函数定义一个常量:2.定义常量名称及值,代码为[define(name,value,case_insensitive)]:3.定义一个大小写敏感的常 ...
- #define c# 报错_c语言中#define的用法
c语言中#define的用法 C语言中,可以用 #define 定义一个标识符来表示一个常量.其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译 ...
- C++中 #define的用法
C++中 #define的用法 转自:http://blog.csdn.net/lyl_98/article/details/900158 今天整理了一些#define的用法,与大家共享! 1.简单的 ...
- #define的用法
#define的用法 #define的用法 #define 又称宏定义.用法:通过#define命令用一个指定的标识符代表一个字符串,这个标识符称为宏名.将程序中出现的与宏名相同的标识符替换字符串的过 ...
- C语言#define的用法,C语言宏定义
#define 叫做宏定义命令,它也是C语言预处理命令的一种.所谓宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串. 我们先通过一个例子来看一下 ...
- c语言define需要分号骂,C语言中define的用法
C语言中define的用法 2016-01-06 15:00 来源: 博客园 define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便. 预处理命令以"#& ...
- C语言define高级用法大全
今天在看代码时,突然发现很多define的用法看不懂,故在此总结一下,顺便吐槽一下,C语言的宏复杂起来真的很难看懂. 不信的去看下这个的源码:[C语言开源库]lw_oopc:轻量级的C语言面向对象编程 ...
最新文章
- 建房子 最安全图纸_农村建什么样的房子合适?分享15套图纸,总有一套适合你...
- java hashset应用_三.java集合的应用
- centos 7 ldap php7,centOS更新php7
- Zookeeper与Paxos
- 解决IE6透明PNG图片的代码
- 第一节:别出心裁的HTML5简介
- CentOS7 下安装 Redis
- Cocos2d-x-使用脚本概述
- 设计模式--单例模式(二)双重校验锁模式
- UNIX 环境高级编程
- Quartus II软件的使用
- 【批处理DOS-CMD命令-汇总和小结】-输出/显示命令——echo
- 1寸证件照排版、1寸照片、1寸证件照尺寸,不改变图片大小改分辨率,不改变分辨率改变(保证分辨率)...
- 前端处理 token 时效性问题
- linux下qt实现计算器,QT实现简单计算器功能
- 逆向工程MBG(MyBatis Generator)
- 计算机的aero界面是一种,Win8桌面UI大变脸 去除Aero Glass等特效
- 小邵教你玩转Typescript、ts版React全家桶脚手架
- 计算机的六种连接方式
- Ubuntu 添加 chrome 浏览器
热门文章
- stm32f105移植到gd32f305笔记
- 【UE Unreal Camera】【保姆级教程二】手把手教你通过UE获取摄像头帧数据
- 《写给大家看的设计书》《写给大家看的色彩书》《点石成金》《形式感》学习笔记...
- 【通州爆料】S6线、京唐城际、京滨城际开工时间发布。
- 像角斗士一样地活着!
- 计算机excel没点保存,【2人回答】电脑突然断电,EXCEL没保存怎么找回已录入的资料?-3D溜溜网...
- 拓嘉辰丰:拼多多活动结束,怎样避免流量大跌尴尬期
- html5字体动画效果,7款超华丽的HTML5 Canvas文字动画特效
- (02)Cartographer源码无死角解析-(32) LocalTrajectoryBuilder2D::AddRangeData()→点云的体素滤波
- git branch -f的作用