C语言进阶
编译
- gcc/g++
- 编译过程
- 源码
.c/.h - 预处理
.i找头文件 展开宏 - 编译
.s错误发生处 汇编 - 汇编
.og++ -c name.c生成 - 链接
.exe(out)
- 源码
- 编译过程
- 静态库和动态库
- 静态库 打包到一起
- 动态库 运行时去找
- Makefile
- 全部重编
hello: main.cpp func1.cpp func2.cppg++ -o hello main.cpp func1.cpp func2.cpp
- 局部重编
hello: main.o fun1.o func2.og++ -o hello main.o fun1.o func2.omain.o: main.cppg++ -c main.cpp- 略
- make [Makefile]
- 全部重编
- CMake
CMakeLists.txtcmake_minimum_required(VERSION 3.10)project(hello)add_executable(hello main.cpp func1.cpp func2.cpp)
- 用于生成makefile文件用来make
- 设置路径等基本操作
- 静态库与动态库构建
- 外部共享库
- 常用变量和指令
- 使用vscode扩展
Makefile
C = g++
T = hello
S = $(wildcard *.cpp)
O = $(patsubst %.cpp, %.o, $(S))
F = -c -Wall
$(T): $(O)
$(C) -o $@ $^
%.o: %.cpp
$(C) $(F) $< -o $@
.PHONY: clean
clean:
rm -f *.o $(T)标准库
assert.h断言assert()断言 运行时static_assert()静态断言 编译时
ctype.h类型判断isalnum()是否为字母数字isalpha()是否为字母isascii()是否ascii码isdigit()是否为数字isxdigit()是否为十六进制数字符islower()是否为小写字母isupper()是否为大写字母isblank()是否为标准的空白字符(包含空格、水平制表符或换行符)isspace()是否为空白字符(空格、换行符、换页符、回车符、垂直制表符、水平制表符等)iscntrl()是否为控制字符,比如 Ctrl + Bisprint()是否为可打印字符isgraph()是否为空格以外的任意可打印字符ispunct()是否为标点符号(除了空格、字母、数字以外的可打印字符)toascii()将字符c转换为ascii码tolower()将字符c转换为小写英文字母toupper()将字符c转换为大写英文字母
errno.herrno变量 用来存储错误码float.h浮点数相关宏FLT_ROUNDS四舍五入方向FLT_RADIX指数部分的底- 略....
inttypes.h格式化占位符iso646.h常见运算符的替代拼写and &&and_eq &=bitand &bitor |compl ~not !not_eq !=or ||or_eq |=xor ^xor_eq ^=
limits.h各种整数类型的最大小值CHAR_MINCHAR_MAXINT_MININT_MAX- 略...
locale.h本地化设置- 数字格式货币格式字符集日期和时间格式
math.hfabs()求浮点数x的绝对值abs()求整数x的绝对值acos()求x(弧度表示)的反余弦值asin()求x(弧度表示)的反正弦值atan()求x(弧度表示)的反正切值atan2()求y/x(弧度表示)的反正切值ceil()求不小于x的最小整数cos()求x(弧度表示)的余弦值cosh()求x的双曲余弦值exp()求e的x次幂floor()求不大于x的最大整数fmod()计算x/y的余数frexp()把浮点数x分解成尾数和指数ldexp()返回x*2^exp的值modf()将浮点数num分解成整数部分和小数部分hypot()对于给定的直角三角形的两个直角边,求其斜边的长度log()计算x的自然对数log10()计算x的常用对数pow()计算x的y次幂pow10()计算10的x次幂sin()计算x(弧度表示)的正弦值sinh()计算x(弧度表示)的双曲正弦值sqrt()计算x的平方根tan()计算x(弧度表示)的正切值tanh()求x的双曲正切值signbit()是否带有符号isunordered()两个参数之中,是否存在 NAN
signal.h信号处理signal(SIGINT, handler)指定某种信号的处理函数raise()发信号
stdint.h- 固定宽度的整数类型别名
- 最大宽度的整数类型
- 固定宽度的整数常量
- 固定宽度的整数极限值
- 格式化占位符
stdlib.hsize_tNULL RAND_MAXvoid exit(int retval)结束程序char *itoa(int i)把整数i转换成字符串double atof(const char *s)将字符串s转换为double类型int atoi(const char *s)将字符串s转换为int类型 "123"=>123long atol(const char *s)将字符串s转换为long类型double strtod (const char*s,char **endp)将字符串s前缀转换为double型long strtol(const char*s,char **endp,int base)将字符串s前缀转换为long型unsinged long strtol(const char*s,char **endp,int base)将字符串s前缀转换为 unsinged long型strtoul()字符串转成 unsigned long int 类型int rand(void)产生一个0~RAND_MAX(INT_MAX)之间的伪随机数void srand(unsigned int seed)初始化随机数发生器srand(time(NULL))void *calloc(size_t nelem, size_t elsize)分配主存储器void *malloc(unsigned size)内存分配函数void *realloc(void *ptr, unsigned newsize)重新分配主存void free(void *ptr)释放已分配的块aligned_alloc()分配满足内存对齐要求的内存块void abort(void)异常终止一个进程void exit(int status)终止应用程序quick_exit()int atexit(atexit_t func)注册终止函数at_quick_exit()system(cmd)执行命令char *getenv(char *envvar)获取环境变量void *bsearch()二分法搜索函数void qsort()使用快速排序例程进行排序qsort(arr, len, sizeof(int), compar);int abs(int i)求整数的绝对值long labs(long n)取长整型绝对值div_t div(int number, int denom)将两个整数相除 , 返回商和余数ldiv_t ldiv(long lnumer, long ldenom)两个长整型数相除 , 返回商和余数- 多字节字符函数略
stdio.h- 标准io
printf() scanf()getchar() putchar()gets()废除 puts()
- 文件IO
fopen()打开文件fclose()关闭文件freopen()打开一个新文件,关联一个已经打开的文件指针fprintf()输出到文件fscanf()从文件读取数据getc()从终端读取一个字符fgetc()从文件读取一个字符putc()向终端写入一个字符fputc()向文件写入一个字符fgets()从文件读取整行fputs()向文件写入字符串fread()从文件读取二进制数据fwrite()向文件写入二进制数据fseek()将文件内部指针移到指定位置ftell()获取文件内部指针的当前位置rewind()将文件内部指针重置到文件开始处fgetpos()获取文件内部指针的当前位置fsetpos()设置文件内部指针的当前位置feof()判断文件内部指针是否指向文件结尾ferror()返回文件错误指示器的状态clearerr()重置文件错误指示器remove()删除文件rename()文件改名,以及移动文件
- 字符串操作函数
sscanf() sprintf() snprintf() tmpfile() tmpnam()创建一个临时文件fflush()清空缓存区setvbuf() setbuf()老版定义某个字节流应该如何缓存ungetc()放回缓存perror()报错信息vprintf() vfprintf() vsprintf() vsnprintf()可变参数操作函数
- 标准io
stdarg.h- 定义于函数的可变参数相关的一些方法
va_list类型va_start() va_end()va_arg()获取当前参数
stddef.hoffsetof()返回某个属性在 Struct 结构内部的起始位置stdbool.hbool true false __bool_true_false_are_definedwchar.h宽字符处理函数wctype.h提供 ctype.h 里面函数的宽字符版本time.htime_tstruct tmtime()秒数ctime()转为可读形式localtime(),gmtime()转换为当前时区/UTC的 struct tm 结构asctime()用来将 struct tm转为可读形式mktime()struct tm 结构转换为 time_t 值difftime()计算两个时间之间的差异strftime()将 struct tm 结构转换为一个指定格式的字符串timespec_get()将当前时间转成距离时间纪元的纳秒数clock()从程序开始执行到当前的 CPU 时钟周期
字符串/内存进阶
string.hstrcpy() strncpy()复制strcat() strncat()连接strcmp() strncmp()比较strlen()长度strchr() strrchr()左右开始查找字符strspn() strcspn()查找(不)属于指定字符集的字符串长度strpbrk()搜索指定字符集的任一个字符strstr()在一个字符串里面,查找另一个字符串strtok()将一个字符串按照指定的分隔符分解strcoll()比较本地化设置的字符串strxfrm()将一个本地化字符串转成可以使用strcmp()进行比较的形式strerror()函数返回特定错误的说明字符串memcpy()内存复制函数memmove()内存复制函数(允许重叠)memcmp()比较两个内存区域memchr()在内存区域中查找指定字符memset()将一段内存全部格式化为指定值