#define m 100 #define ret register//用ret来替换registr #define do_forever for( ; ;)//死循环 #define x int* #include<stdio.h> intmain() { ret int b = 10; do_forever; int a = m;//100 x p=&a;//p为int*的指针变量 return0; }
1 2 3 4 5 6 7 8 9 10 11 12
#define x int * typedefint * INT #include<stdio.h> intmain() { x a,b; INT c,d; //其中只有b不是指针 //因为define只完成代码的替换,替换成了int* a,b//a是指针,b不是指针 //而typedef是对类型的重命名, return0; }
intmain() { int c = max(101, m);//宏替换, printf("m=%d", m);//括号里面的m不被替换 return0; }
预处理操作符#和##的介绍
#可以把参数插入到字符串中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#define print(x) printf("the value of " #x " is %d\n",x)//#x会变成x对于的内容所对于的字符串"a" #include<stdio.h> intmain() { printf("hello world\n"); printf("hello""world\n");//结果是一样的, //写3个printf()有点冗余, int a = 10; print(a); //the value of a is 10 int b = 20; print(b); //the value of b is 20 int c = 30; print(c); //the value of b is 30 printf(""); return0; }
##可以把两个符号合成一个符号,两个符号连在一起
1 2 3 4 5 6 7 8
#define cd(x,y) x##y #include<stdio.h> intmain() { int c = 100; printf("%d", cd(c, 120));//替换成100120 return0; }
带副作用的宏参数
首先介绍一下什么是副作用
int a=1; int b=a+1;//b=2,a=1,没有副作用 int b=++a//b=2,而a=2这里的a就是有副作用,
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include<stdio.h> #define max(x,y) (x)>(y)?(x):(y) intmain() { int a = 5; int b = 8; int c = max(a++, b++); //int c = (a++) > (b++) ? (a++) : (b++);替换 //5>8不成立,执行完判断语句,a和b就加1,a=6,b=9,则执行b++,但b++是先使用在++ //c=9,执行完后b=10