1.宏
预处理指令:
经常写在函数之前的以#开头的指令,作用是在编译前对源文件进行处理,包括宏定义、文件包含和条件编译。
宏:
C语言中我们自己定义的特殊标识符,习惯大写
宏的定义:
#define 宏名 宏字符串(可以是常量、变量、表达式)
注意:宏名一般用大写,宏定义末尾不加分号,如加上分号则连分号一起替换
宏替换:
源程序在编译之前,由预处理程序对我们写的代码进行处理:会把源代码中所有出现宏名的地方一律使用宏的字符串去替换
宏的使用注意事项:
1)宏是有作用域的,#undef 宏名 可以取消宏定义
2)在字符串中出现的宏名不会被替换
3)宏可以嵌套定义
宏的分类:
无参宏 #define M 10
有参宏 #define SUM(a) a+a
SUM(3) // 不仅要用a+a替换,而且还要把实参3代入到字符串中
有参宏的使用注意事项:
1)宏的形参之间可以出现空格,但是宏名和形参之间不能出现空格
#define M(x , y) x*y+100-y
2)有参宏的参数最好用括号括起来
#define M1(x , y) (x)*(y)+100-(y)
3)可以用宏来定义多个语句
#define M2(m,n) m = a +2; n = a*4;
使用举例:
#include <stdio.h>
#define A a*a+100
#define SUM(a,b) a+b
#define M2(m,n) m = a +2; n = a*4;
int main(int argc, const char * argv[]) {
int a = 10;
//无参宏的使用
int result = 3*A - A/10 + 2; // 此处会用a*a+100替换A,注意:并不会加上括号
printf("%d\n",result);
// 有参宏的使用
int result1 = SUM(34,23);
printf("%d\n",result1);
// 用宏定义多个语句的使用
int i = 0;
int j = 0;
M2(i, j)
printf("i = %d j = %d",i, j);
return 0;
}
// 使用有参宏求最大值
#include <stdio.h>
// 定义一个有参宏,求两个数的最大值
#define MAX(a,b) a > b ? a : b
int main(int argc, const char * argv[]) {
// 使用有参宏求最大值
printf("%d",MAX(-34, 23));
return 0;
}
条件编译:
发生在预处理阶段,在编译之前做的事。
核心:根据条件编译指定的代码,条件不同,编译的部分也不同,生成的目标文件(.o)大小也不一样
条件编译指令
1)#if #elif #else #endif
2)#ifdef 用来判断某个宏是否定义
#ifndef 用来判断某个宏是否没有定义
1)#if - #else 条件编译指令使用:
#include <stdio.h>
#define score 76
int main(int argc, const char * argv[]) {
#if score < 60
printf("E\n");
#elif score <= 69
printf("D\n");
#elif score <= 79
printf("C\n");
#elif score <= 89
printf("B\n");
#else
printf("A\n");
#endif
return 0;
}
2) #ifdef 和 #ifndef 条件编译指令使用
#include <stdio.h>
#define DEBUG1 0
int main(int argc, const char * argv[]) {
int a = 0;
#ifdef DEBUG1 // #ifdef检测宏是否定义
a = 10;
#else
a = 10000;
#endif
printf("%d\n",a);
// #ifndef 如果宏没有定义
#ifndef DEBUG2
a = 100;
#else
a = -1;
#endif
printf("%d\n",a);
return 0;
}
我们可以使用条件编译指令来调试bug,在以下代码中,如果DEBUG1的值设为1,则会输出调试信息,若设为0,则不会输出。
#include <stdio.h>
#define DEBUG1 1
#if DEBUG1 == 1
// 显示调试信息
#define Log(format,...) printf(format,## __VA_ARGS__);
#else
// 不显示调试信息
#define Log(format,...)
#endif
int main(int argc, const char * argv[]) {
Log("这是调试信息!!!%d\n",2222)
return 0;
}