预处理语句:
特点:以#开头的语句
#include:
包含一个头文件,指的是把头文件的内容复制过来源码.c文件
#include <head.h>:
从系统环境里面找到对应的头文件
#include "head.h":
从本地开始找,如果找不到再到系统环境里面找
如何在编译的时候指定环境:
-I 头文件路径
一般头文件里面写什么东西:
预处理语句:头文件,宏定义等
类型定义:typedef,各项结构体,共用体,枚举的声明
外部声明语句:extern 函数, extern 变量
#define:
宏定义:就是直接替换
宏定义一般加上(),以解决替换的时候的优先级问题,影响正常的逻辑
宏函数:
1,具备强大的兼容性,函数内部没有参数类型,没有返回值类型
2,宏函数它的返回值等于最后一条表达式的值
3,它也是个纯粹的替换
4,换行符是\
预处理语句都必须在一行里面,如果不在一行,请用换行符
条件编译:
格式:
#ifdef 宏定义
判断后面这个宏定义是否有定义,如果有定义则选择编译这段话的内容
#else 这个可以不加
否则编译这段话的你内容
endif 代表条件编译结束
格式:
#ifndef 跟上面的逻辑相反
#else
否则编译这段话的你内容
endif 代表条件编译结束
#if 判断后面的值是否为真,真的话则编译
#else
#endif
变参函数:
参数没有固定化的函数
例如printf这个函数;
1,变参函数第一个参数一般是字符串,因为需要指定后面数据的分析格式
2,变参函数的后面的参数个数是可变的,但是需要跟你之前指定的格式相互匹配
3,变参函数的变参传参原理引用栈原理
系统里面提供了变参函数的处理数据类型和函数原型给我们,方便调用变参函数:
va_list:变参函数的参数的链表头(首地址)类型
va_start(va_list arg_ptr, const char *format);
这个函数指定变参函数的链表头指向哪里(指定地址到format这个地址后面)
va_arg(arg_ptr, int);
这个函数是获取从当前位置(arg_ptr)之后按照某种格式(int)的数据,
每次获取完之后它(arg_ptr链表头(首地址))
都会往后偏移到下一个数据的位置
如何使用GDB调试器:
1,编译程序的时候添加一个-g的选项
2,调试程序的时候调用gdb命令调试程序
gdb的命令:
1,list:罗列出代码的内容:
list 行数,打印函数附近的代码出来
2,默认回车则执行之前的命令
3,runing:运行程序
r 123 abc 类似于./test 123 abc 传入参数的意思
4,breakpoint:设置断点
b 9:在第九行设置一个断点
b 9 if i==99:如果i变量等于99则在这里设置一个断点
delete breakpoint 2:删除第二个断点
5,infomation:
info b打印断点信息
6,单步调试:
step:进入函数里面一步一步运行
声明语句与函数名不具备暂停功能(因为不会出错)
s 10:一次执行10条语句
next:不进入函数
7,printf:
查看变量的值,如:p i,打印变量i的值
whatis:
查看变量类型,如:whatis i
display:
全程打印变量的值:如:display i
8,查看栈:
backtrace full:查看栈信息
简写:bt full
9,continue:
程序继续运行