本文主要是介绍#define详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#define的概念:#define命令是C/C++语言中的一个宏定义命令。宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。预处理命令后通常不加分号。这并不是说所有的预处理命令后都不能有分号出现。由于宏定义只是用宏名对一个字符串进行简单的替换,因此如果在宏定义命令后加了分号,将会连同分号一起进行置换。
该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。
在使用宏定义时应注意的是:
(a)在书写#define 命令时,注意<宏名>和<字符串>之间用空格分开,而不是用等号连接。
(b)使用#define定义的标识符不是变量,它只用作宏替换,因此不占有内存。
(c)习惯上用大写字母表示<宏名>,这只是一种习惯的约定,其目的是为了与变量名区分,因为变量名通常用小写字母。
使用#define的常见问题
(1) 简单的宏定义:
#define 宏名 字符串
例: #define PI 3.1415926
(2) 带参数的宏定义
#define 宏名(参数表) 宏体
例: #define A(x) x
一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。
(3)宏定义可以嵌套,已被定义的标识符可以用来定义新的标识符。例如:
#define PI 3.14159265
#define R 10
#define AREA (PI*R*R)
(4)如果某一个标识符被定义为宏名后,在取消该宏定义之前,不允许重新对它进行宏定义。取消宏定义使用如下命令:
#undef<标识符>
其中,undef是关键字。该命令的功能是取消对<标识符>已有的宏定义。被取消了宏定义的标识符,可以对它重新进行定义。
(5)简单宏定义使用中出现的问题
在简单宏定义的使用中,当替换文本所表示的字符串为一个表达式时,容易引起误解和误用。如下例:
#define Add(a,b) a*b 如果在程序中出现如下语句: result=Add(2, 3) 则被替换为: result=2*3; 结果是6 如果程序中出现如下语句: result= Add(3+2, 3+4); 则被替换为:
result=3+2*3+4; 这里的结果是13和我们想要的结果不一直
因为宏是字符串替代所以就成了13这个结果,也就是a用3+2替代,b用3+4替代了。而并非我们想象的(3+2)*(3+4)
但是我要的就是(3+2)*(3+4)这个结果,我们该怎么做了呢?
这样就行了#define Add(a,b) (a)*(b)
(6)一些特殊的符号
#define Link(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
x##y表示x连接y
char * str= Link("fei","12"); 结果就是str="fei12";
#@x给x加上单引号
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant :P
#x 加双引号,这里就不在举例了。
这篇关于#define详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!