c语言---宏

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))

猜你喜欢

转载自blog.csdn.net/qq_42024067/article/details/107291540
今日推荐