宏的实例总结

一、定义:

define 宏名 标识符

列:#define PRINE\
printf(“Hello\n”)

1、宏名通常要大写
2、标识符后一般不要加“;”防止出错
3、当一行写不下时可使用续行符(“\”),但续行符后不可输入空格和注释。
4、宏的参数与类型无关,可以为任何类型
5、宏相当于直接替换掉相关的代码,执行速度快。
6、宏定义中可以有其他的宏定义,但不可出现递归造成死循环。
8、宏的替换是在预处理时实现的,可以在linux环境中运行查看

代码实例解析:

//二进制奇偶位交换
#include<stdio.h>
#include<stdlib.h>
#define CHANGE(num)\
(((num&(0x55555555))<<1)|((num&(0xAAAAAAAA))>>1))//二进制奇偶位交换
//0x5555 5555=0101 0101 0101 0101 0101 0101 0101 0101
//0xAAAA AAAA=1010 1010 1010 1010 1010 1010 1010 1010 

int main()
{
    int i=0;
    int n=2;
    int num=5;//交换的数字

    printf("改变前位为\n");
    for(i=31;i>=0;i--)
//从高位到低位输出二进制位
    {
        printf("%d ",num>>i&1);
    }

    num=CHANGE(num);
    printf("\n改变后位为\n");
    for(i=31;i>=0;i--)
    {
        printf("%d ",num>>i&1);
    }

    system("pause");
    return 0;
}


//求两个数中最大数
#include<stdio.h>
#include<stdlib.h>
#define MAX(num1,num2)\
    (num1>num2 ? num1:num2)//求最大数
#define MAX1(num1,num2)\
    ((num1)>(num2)?(num1):(num2))

int main()
{
    int num1=3;
    int num2=5;
    int num3=0;

    printf("%d\n",MAX(num1,num2));
    printf("num1=%d num2=%d num3=%d\n",num1,num2,num3);

    //同于num3=(num1++)>(num2++)?(num1++):(num2++);比较结束后选择为num2=5赋给num3,后num1+1=4,num2+1=6
    num3=(num1++,num2++);
    printf("num1=%d num2=%d num3=%d\n",num1,num2,num3);//4,6,5
    system("pause");
    return 0;
}

//其他相关应用
#include<stdio.h>
#include<stdlib.h>

#define CASE break;//自动在CASE后加break;
#define SQUARE(x) x*x//计算两数乘积
#define PRINT(FORMATE,VALUE)\
    printf("the value is "#VALUE " is " FORMATE "\n",VALUE)
//PRINT与(之间不可有空格,'\'是续行符,但'\'后不可有输入空格和注释,#是将宏参数转变成字符串
#define ADD_TO_SUM(num,value)\
    sum##num=value;//##是合成符号,即将sum与num成在一起成num(num) 即num6=value
#define MALLOC(num,type)\
    (type *)malloc (num*sizeof(type))//每次动态开辟num个type的类型空间,宏可传递类型
int main()
{
    int num=0;
    int sum6=0;
    char *arr[2];
    printf("输入数字:");
    scanf("%d",&num);
    switch(num)
    {
    CASE 1;//输入1退出
    case 2:
        printf("%d\n",SQUARE(5+1));//5+1*5+1=11
        break;
    case 3:
        PRINT("%d",10+2);//等同于 printf("the value is " 10+2 " is " %d "\n",10+2)
        break;
    case 4:
        ADD_TO_SUM(6,11);
        printf("%d\n",sum6);
        break;
    case 5:
        arr[0]=MALLOC(10,char);//给arr[0]开辟10个内存空间
        free ;//释放内存空间
        break;

     default:
        printf("输入错误\n");
        break;
    }

    system("pause");
    return 0;
}

//预处理—–去掉注释和替换宏
其他相关应用代码预处理后代码为:

# 3 "hong.c" 2
# 13 "hong.c"
int main()
{
 int num=0;
 int sum6=0;
 char *arr[2];
 printf("输入数字:");
 scanf("%d",&num);
 switch(num)
 {
    break; 1;
 case 2:
  printf("%d\n",5+1*5+1);
  break;
 case 3:
  printf("the value is ""10+2" " is " "%d" "\n",10+2);
  break;
 case 4:
  sum6=11;;
  printf("%d\n",sum6);
  break;
 case 5:
  arr[0]=(char *)malloc (10*sizeof(char));
  free ;
  break;

 default:
  printf("输入错误\n");
  break;
 }

 system("pause");
 return 0;
}

在linux环境中可看预处理后的文件
Linux:常用命令
1、LL—–展开目录
2、cd—————-打开文件夹   列 cd linux
3、pwd ————-显示路径
4、cd..—————返回上一目录
5、mkdir————创建文件夹   列 mkdir linux
6、touch————创建文件     列 touch hong.c
7、gedit————-编写代码 列 gedit hong.c
8、gcc —————编译           列 gcc hong.c
9、gcc -o——– –编译自起生成文件名 列gcc hong.c -o myhong
10、./myhong———-运行myhong
11、gcc -E hong.c -o hong.i—–生成预处理文件(-o 自起生成文件名)
12、gcc -S hong.c -o hong.s—-生成汇编文件
13、gcc -c hong.c  -o hong.o–生成二进制文件
14、gcc  hong.o-o myhong—-链接
15、rm—————-删除文件       列 rm hong.c
16、vim—————显示文件内容 列 vim hong.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值