预处理指令
预处理指令:编译之前进行解析处理的指令源码-> 编译预处理 -》 编译 -》链接 ->运行
所有预处理指令都是以#开头
所有的预处理指令都不需要分号
所有的预处理指针都可以写文件任意位置
1、宏定义 2、文件包含 3、条件编译
宏定义:不带参数宏定义 和 带参数宏定义
不带参数的宏定义:#define 宏名 值
宏名的命名规则:1、全部大写多个单词中间使用_分割 2、以k开头驼峰标示
作用:在编译预处理的时候把代码中所有出现宏名地方都替换为宏名后面值
好处:提高代码可读性
宏定义的作用域是从定义的哪一行开始直到文件结束
带参数宏定义
带参数宏定义的格式: #define 宏名(参数列表) 参数表达式
带参数的宏定义的参数列表是没有类型的
宏名与后面小括号中间不可以有空格,如果加上空格就是不带参数宏定义
宏定义非常单纯,就是一个替换操作
我们定义带参数宏的时候,后边表达式所有的操作数与结果都加上小括号
可以变参数宏定义
#define SUM(num1,num2) (num1 + num2)
#define MULTIPLY(num1,num2) ((num1) * (num2))
#define LOG(format,...) printf(format,## __VA_ARGS__)
//...表示可变参数
//## 表示后参数是可有可无的
int main(int argc, const char * argv[]){
int s = sum(10,20);
// s = SUM(2,2) * SUM(2, 2);
// (10) * (2 + 2) / (2 + 2) * (10)
int result = MULTIPLY(10, 2+2) / MULTIPLY(2 + 2, 10);
printf("result = %d\n",result);
// LOG("a = %d,b = %d \n",10,20);
LOG("hello\n");
return 0;
}
条件编译
//if在程序运行时候来判断是否满足条件表达式,如果满足条件表达式就执行相应的代码块//条件编译的格式
条件编译的使用方式与if语句相同
条件编译:在预编译的时候,如果条件满足就将代码编译到.o文件中
#if 条件表达
语句;
...
#endif;
注意点:1、条件编译不需要大括号
2、必须以#endif结尾
3、条件表达式中仅可以使用常量和宏
1、被注释的语句不参与编译
2、只有满足条件才会参与编译
#define A 5
int main(int argc, const char * argv[])
{
// int a = 5;
// if (a == 10) {
// printf("a = 10\n");
// }else if(a == 5){
// printf("a = 5\n");
// }else{
// printf("other\n");
// }
#if A == 10
printf("a = 10\n");
#elif A == 5
printf("a = 5\n");
#else
printf("other\n");
#endif
//#define DBUG 0
#if DBUG == 1
#define Log(format,...) printf(format,## __VA_ARGS__)
#else
#define Log(format,...)
#endif
// Log("输出日志 a = %d\n",10);
条件编译的变体
// 如果定义了 DBUG 宏就编译下面的语句#if defined(DBUG)
printf("DBUG");
#else
printf("release\n");
#endif
//#if ndefined(DBUG)
#ifdef DBUG
printf("DBUG");
#endif
#ifndef DBUG
printf("没有定义 DBUG\n");
#endif
return 0;
}
文件包含
/*#include 作用是拷贝文件
#include "" 包含我们自己写的头文件
#include <> 系统自带的头文件
*/