宏
1、仅仅替换
2、不能定义宏参类型
3、不会检查宏参有没有定义
定义带参数的宏“#define JH(a,b,t) t=a; a=b; b=t”,对两个参数a、b的值进行交换,下列表述中正确的是( )。
宏的作用域:具体替换的值只与define在文件中的位置有关,与是否在函数内无关。
define在预处理阶段就会进行宏定义替换,
#define a 10
void foo();
void prin();
int main()
{
prin();
printf("%d ", a); 此行a被替换成10
foo();
printf("%d ", a); 此行a被替换成10
}
void foo()
{
#undef a
#define a 50 如果这一行扔了则在20行会报错未定义
}
void prin()
{
printf("%d ", a); 此行a被替换成50
}
这里宏的作用域会被分割:
1-15行:a会被替换成10
16-21行:a会被替换成50
故函数运行结果为50 10 10
宏的使用实例
1、利用宏定义求出数组teble元素的个数
#define N (sizeof(table)/sizeof(table[0]))
2、乘法
#define A(a,b) ((a)*(b))
比较两个数的大小
方法1:相减后提取出符号位,查看是正数or负数
原理:若a>b,则(a-b)的结果为正数,正数的最高位为0;反之为负数,负数的最高位为1
#define MAX1(a,b) (((((a)-(b))&0x80000000))?(b):(a))
方法2:用abs()查看符号位
原理:若a>b,则abs(a-b) 和(a-b)相等;反之不相等
#define MAX2(a,b) (abs((a)-(b)) == ((a)-(b)) ? (a) : (b))
#define foo() do{……}while(0)
使用: foo();
宏定义中使用do{}while(0):
1、将多个语句作为一个整体来处理,
例如:在if else结构中do{}while内的多条语句会作为一个分支,而非多个
2、空的宏定义避免warning
例如:#define foo() do{}while(0)
3、作为一个独立的block,用变量定义,实现复杂的功能
4、如果仅仅使用{}则替换后会出错
例如: #define foo(x) { bar(x); baz(x); }
替换前:
if (!feral)
foo(wolf);
else
bin(wolf);
替换后:
if (!feral) {
bar(wolf);
baz(wolf);
};
else
bin(wolf);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)