c语言的宏定义 if defined
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言的宏定义 if defined相关的知识,希望对你有一定的参考价值。
在c语言的开头 #if defined(hdr) defin hdr #endif 这里的hdr 或者其他头文件名 必须在其中的头文件中有 define 文件名 是这样吗,为什么书上写的这么多歧义, 都是直接来个 if defined 来检测 其实响应的头文件还要有一句
参考技术A 没有说得那么繁琐.因为对于一个大程序而言,我们可能要定义很多常量(
不管是放在源文件还是头文件
),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if
defined宏正是为这种情况提供了解决方案.举个例子,如下:
#define
....
#define
....
........
........
#define
a
100
.......
此时,我们要检查a是否定义(假设我们已经记不着这点了),或者我们要给a一个不同的值,就加入如下句子
#if
defined
a
#undef
a
#define
a
200
#endif
上述语句检验a是否被定义,如果被定义,则用#undef语句解除定义,并重新定义a为200
同样,检验a是否定义:
#ifndef
a
//如果a没有被定义
#define
a
100
#endif
以上所用的宏中:#undef为解除定义,#ifndef是if
not
defined的缩写,即如果没有定义。
这就是#if
defined
的唯一作用!
C语言中带参数的宏
带参数的宏定义有如下的格式:
【#define 指令----带参数的宏】 #define 标识符(x1,x2,……,xn)
其中 x1,x2,……xn是标志符(宏的参数)
注意:在宏的名字和括号之间必修没有空格。
如果有空格,预处理会认为是在定义一个简单的宏,其中(x1,x2,……,xn)是替换列表的一部分
当预处理器遇到一个带参数的宏,会将定义存储起来以便以后使用。在后面的程序中,如果任何地方出现了标识符(y1,y2……,yn)格式的宏调用(其中y1,y2, ……yn是一些列标记),预处理器会使用替换列表替代,并使用yi替换xi
e.g. 假如我们定义了如下的宏:
#define MAX(x,y) ((x)>(y) ? (x) : (y)) #define IS_EVEN(n) ((n)%2==0)
下面的例子是一个更加复杂的宏:
#define TOUPPER(c) (\'a\'<=(c) && (c)<=\'z\' ? (c)-\'a\'+\'A\' : (c))
带参数的宏可以包含空的参数列表,如下所示:
#define getchar() getc(stdin)
空的参数列表不是一定确实需要,但可以使getchar更像一个函数
使用带参数的宏替代实际的函数有两个优点:
- 程序可能会稍微快些。一个函数调用在执行时通常会有些额外开销----存储上下文信息、复制参数的值等。而一个宏的调用则没有这些运行开销
- 宏会更“通用”。与函数的参数不同,宏的参数没有类型。因此,只要预处理后的程序依然合法的,宏可以接受任何类型的参数。 e.g.我们可以使用MAX宏从两个数中选出较大的一个,数的类型可以是:int,long int,float,double等等
- 编译后的代码通常会变大。每一处宏调用都会导致插入宏的替换列表,由此导致程序源代码增加(因此编译后的代码变大)。宏使用得越频繁,这种效果就越明显。当宏调用嵌套时,这个问题会相互叠加从而使程序更加复杂。e.g. n=MAX(i,MAX(j,k));
下面是预处理后的这条语句:
n=((i)>(((j)>(k)?(j):(k)))?(i):(((j)>(k)?(j):(k))));
- 宏参数没有类型检查。
- 无法用一个指针来指向一个宏
- 宏可能会不止一次地计算它的参数。函数对它的参数只会计算一次,而宏可能会计算两次甚至更多。如果参数有副作用,多次计算参数的值可能会产生意外的结果
考虑下面的例子,其中MAX的一个参数有副作用:
n=MAX(i++, j)
下面是这条语句在预处理之后的结果:
n=((i++) >(j)?(i++):(j));
带参数的宏不仅适用于模拟函数的调用,他们特别经常被作为模板,来处理我们经常要重复书写代码段:
e.g.我们可以使用
#define PRINT_INT(x) printf("%d\\n",x);
使得PRINT_INT(x)代替每次使用的printf("%d\\n",x);
转自http://www.cnblogs.com/cpoint/p/3367386.html
以上是关于c语言的宏定义 if defined的主要内容,如果未能解决你的问题,请参考以下文章