defined在c语⾔中的作⽤,c语⾔defined的⽤法
C语⾔中的#define命令在使⽤过程中的常见问题,分析了问题产⽣的原因并提出了解决⽅法,从编译程序对C源程序的处理过程阐述宏展开的
时机,⼒求从根本上对宏定义进⾏阐述,并在最后指出使⽤宏定义的优点,以促使对宏定义使⽤的重视。下⾯⼩编就跟⼤家介绍下c语⾔
defined的⽤法。
1.简单的宏定义
#define标识符替换列表(替换列表可以是数,字符串字⾯量,标点符号,运算符,标识符,关键字,字符常量。注意:替换列表是可以为
空的)
典型错误:
#defineN=100
inta[N];/*这样会成为inta[=100],这⾥会处理成为⼀种标识记号⼀样*/
#defineN100;
inta[N];/*带分号的定义会成为inta[100;],这是⼀种很常见的错误*/
#definepin(int*);
pina,b;
int*a,b;/*本意是a和b都是int型指针,但是实际上变成int*a,b;a是int型指针,⽽b是int型变量。这是应该使⽤typedef来代替define,这
样a和b就都是int型指针了。*/
典型的使⽤⽅法:
使⽤宏定义我们可以⾃⼰根据⾃⼰的习惯来定义甚⾄改变C语⾔的语法习惯,例如:
#defineBEGIN{
#defineEND}
intmain()BEGIN
printf("DEFINE----n");
END
定义⼀个循环
#defineLOOPfor(;;)
重新定义数据类型
#defineITint
2.带参数的宏
#define标识符(x1,x2,x3...xn)替换列表(注意:x1,x2,x3..是宏的参数,标识符和其左括弧之间不能有空格)
使⽤⽅法:
#defineMAX(x,y)((x)>(y)?(x):(y))
i=MAX(j+k,m-n);
替换为:
i=MAX((j+k)>(m-n)?(j+k):(m-n));
#defineSI_EX(n)((n)%2==0)
if(SI_EX(i))i++;
替换为:
if(SI_EX((i)%2==0))
通过以上例⼦我们可以看出,标识符带参数(X1,X2,X3.....)在替换时会被替换列表(Y1,Y2,Y3....)对应的替换,但是和顺序⽆关。
3.宏的特殊单⾏定义
#defineA(x)T_##x
#defineB(x)#@x
#defineC(x)#x
x=1
替换为:
A(1)------>T_1(T_##x,##符号是记号粘黏符号,将前后的字符粘黏起来。)
B(1)------>'1'(#@x,#@符号会将宏的参数进⾏字符串字⾯量化,并且加‘’号)
C(1)------>"1"(#x,#符号会将宏的参数进⾏字符串字⾯量化,并且加""号)
的多⾏定义
define可以替代多⾏的代码,在每⼀个换⾏的时候加上⼀个""
#defineMAX(X,Y)do{
语句1;
语句2;
/*注释的写法*/
}while(0)/*(notrailing;)*/
5.在⼤规模的开发过程中,特别是跨平台和系统的软件⾥,define最重要的功能是条件编译。
#ifdefWINDOWS
......
......
#endif
#ifdefLINUX
......
......
#endif
可以在编译的时候通过#define设置编译环境
6.取消宏
#undef标识符
7.条件编译
#ifdefXXX…(#el)…#endif
8.预定义宏
在C语⾔中收录了⼀些有⽤的宏,这些宏是提供当前编译信息的。
__LINE__被编译⽂件的⾏数
(整型)
__FILE__被编译⽂件的名字(字符型)
__DATE__编译⽇期(字符型)
__TIME__编译时间(字符型)
__STDC__如果编译器接受标准C,那么值为1.(整型)
通常我们在编译的时候我们可以⽤这些预定义的宏来进⾏排错,例如:
⼀般情况下,当出现除零的情况时编译器是没有提⽰的,我们可以⾃定义⼀个解决办法。
#defineCHECKZERO(divisor)
if(divisor==0)
printf("***ATTEMPTTODIVIDEBYZEROINLINE%doffile%s***n",__LINE__,__FILE__);
引⽤⽅法
CHECKZERO(j);
k=i/j;
本文发布于:2022-12-27 12:52:15,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/40422.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |