0x01 宏

宏定义:
通过 #define 预处理指令可以定义宏
宏的作用:
&nsbp; &nsbp; 宏可以用来给数字起名字
&nsbp; &nsbp; 宏可以用来给计算公式起名字

1
2
#define PI 3.14f
#define CIRCLE(r) 2*PI*r

使用宏在编译的时候,编译器会把程序里所有宏名称替换成它所对应的数字

与函数的区别:
通过如下编译命令可以临时指定宏所代表的数字(函数不能做到)

1
#define PI	3.14f  //假如被注释,程序中又使用了 PI

1
root@localhost~: gcc -D PI=3.14f  xxx.c

宏的参数不一定代表数字,所以它没有类型
如果宏有多个参数,就需要用逗号把它们分开
宏没有形式参数,也没有用来存放返回值的存储区

宏操作符:
#:它可以把宏的参数转换成字符串字面值

1
#define STR(n)	#n

##:把一个代表标识符的参数和其它内容连接得到一个新的标识符

1
#define	PTR(n)	##n 	p_##n

1
2
3
4
5
6
7
8
9
10
11
12
 //宏操作符演示

#include <stdio.h>
#define STR(n) #n
#define PTR(n) p_##n
int main() {
int num = 0;
//int *p_num = &num;
int *PTR(num) = &num;
STR(2 + 4);
return 0;
}

0x02 条件编译

条件编译可以几组语句中选择一组编译而忽略其它组

1
2
#ifdef	…………	#else	…………	#endif	//(宏名称被定义,编译else前的组)
#ifndef ………… #else ………… #endif //(宏名称被定义,编译else后的组)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//demo
#include "stdio.h"
int main(int argc, char const *argv[]){

#ifdef YI
printf("YI 被定义打印这条");

#else
printf("YI 没有被定义打印这条");

#endif

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdio.h"
int main(int argc, char const *argv[]){

#if defined(HONG_NAME)
printf("定义了宏名称[HONG_NAME],编译这条");

#elif !defined(HONG_NAME) && !defined(HONG_NAME_1)
printf("没有定义宏名称[HONG_NAME]和[HONG_NAME_1],编译这条");

#else
printf("没有定义[HONG_NAME],编译这条");

#endif
return 0;
}