一、定义:
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