宏的实例总结

来源:互联网 发布:免费越狱软件 编辑:程序博客网 时间:2024/06/11 22:35

一、定义:

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