学习啦>知识大全>知识百科>百科知识>

什么是宏定义宏定义的参数(2)

时间: 谢君787 分享

  宏定义的冷门重点

  #define用法

  1、 用无参宏定义一个简单的常量

  #define LEN 12

  这个是最常见的用法,但也会出错。

  比如下面几个知识点你会吗?可以看下:

  (1)#defineNAME "zhangyuncong"

  程序中有"NAME"则,它会不会被替换呢?

  (2)#define 0x abcd

  可以吗?也就是说,可不可以用不是标识符的字母替换成别的东西?

  (3)#define NAME "zhang

  这个可以吗?

  (4)#define NAME "zhangyuncong"

  程序中有上面的宏定义,并且,程序里有句:

  NAMELIST这样,会不会被替换成"zhangyuncong"LIST

  四个题答案都是十分明确的。

  第一个,""内的东西不会被宏替换。这一点应该大家都知道。

  第二个,宏定义前面的那个必须是合法的用户标识符

  第三个,宏定义也不是说后面东西随便写,不能把字符串的两个""拆开。

  第四个:只替换标识符,不替换别的东西。NAMELIST整体是个标识符,而没有NAME标识符,所以不替换。

  也就是说,这种情况下记住:#define第一位置第二位置

  (1) 不替换程序中字符串里的东西。

  (2) 第一位置只能是合法的标识符(可以是关键字)

  (3) 第二位置如果有字符串,必须把""配对

  (4) 只替换与第一位置完全相同的标识符

  还有就是老生常谈的话:记住这是简单的替换而已,不要在中间计算结果,一定要替换出表达式之后再算。

  2、 带参宏一般用法

  比如#define MAX(a,b) ((a)>(b)?(a):(b))

  则遇到MAX(1+2,value)则会把它替换成:

  ((1+2)>(value)?(1+2):(value))

  注意事项和无参宏差不多。

  但还是应注意

  #define FUN(a) "a"

  则,输入FUN(345)会被替换成什么?

  其实,如果这么写,无论宏的实参是什么,都不会影响其被替换成"a"的命运。

  也就是说,""内的字符不被当成形参,即使它和一模一样。

  那么,你会问了,我要是想让这里输入FUN(345)它就替换成"345"该怎么实现呢?

  请看下面关于#的用法

  3、 有参宏定义中#的用法

  #define STR(str) #str

  #用于把宏定义中的参数两端加上字符串的""

  比如,这里STR(my#name)会被替换成"my#name"

  一般由任意字符都可以做形参,但以下情况会出错:

  STR())这样,编译器不会把“)”当成STR()的参数。

  STR(,)同上,编译器不会把“,”当成STR的参数。

  STR(A,B)如果实参过多,则编译器会把多余的参数舍去。(VC++2008为例)

  STR((A,B))会被解读为实参为:(A,B),而不是被解读为两个实参,第一个是(A第二个是B)。

  4、 有参宏定义中##的用法

  #define WIDE(str) L##str

  则会将形参str的前面加上L

  比如:WIDE("abc")就会被替换成L"abc"

  如果有#defineFUN(a,b) vo##a##b()

  那么FUN(id ma,in)会被替换成void main()
看过“宏定义的参数”的人还看了:

1.c中define的用法

2.c语言defined的用法

3.c语言宏的用法

4.c语言中define的用法

5.怎么清除Word宏病毒

什么是宏定义宏定义的参数(2)

宏定义的冷门重点 #define用法 1、 用无参宏定义一个简单的常量 #define LEN 12 这个是最常见的用法,但也会出错。 比如下面几个知识点你会吗?可以看下:
推荐度:
点击下载文档文档为doc格式
1617482