C语言进阶
编译
- gcc/g++
- 编译过程
- 源码
.c/.h
- 预处理
.i
找头文件 展开宏 - 编译
.s
错误发生处 汇编 - 汇编
.o
g++ -c name.c
生成 - 链接
.exe(out)
- 源码
- 编译过程
- 静态库和动态库
- 静态库 打包到一起
- 动态库 运行时去找
- Makefile
- 全部重编
hello: main.cpp func1.cpp func2.cpp
g++ -o hello main.cpp func1.cpp func2.cpp
- 局部重编
hello: main.o fun1.o func2.o
g++ -o hello main.o fun1.o func2.o
main.o: main.cpp
g++ -c main.cpp
- 略
- make [Makefile]
- 全部重编
- CMake
CMakeLists.txt
cmake_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.h
errno变量 用来存储错误码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_MIN
CHAR_MAX
INT_MIN
INT_MAX
- 略...
locale.h
本地化设置- 数字格式货币格式字符集日期和时间格式
math.h
fabs()
求浮点数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.h
size_t
NULL RAND_MAX
void 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.h
offsetof()
返回某个属性在 Struct 结构内部的起始位置stdbool.h
bool true false __bool_true_false_are_defined
wchar.h
宽字符处理函数wctype.h
提供 ctype.h 里面函数的宽字符版本time.h
time_t
struct tm
time()
秒数ctime()
转为可读形式localtime(),gmtime()
转换为当前时区/UTC的 struct tm 结构asctime()
用来将 struct tm转为可读形式mktime()
struct tm 结构转换为 time_t 值difftime()
计算两个时间之间的差异strftime()
将 struct tm 结构转换为一个指定格式的字符串timespec_get()
将当前时间转成距离时间纪元的纳秒数clock()
从程序开始执行到当前的 CPU 时钟周期
字符串/内存进阶
string.h
strcpy() strncpy()
复制strcat() strncat()
连接strcmp() strncmp()
比较strlen()
长度strchr() strrchr()
左右开始查找字符strspn() strcspn()
查找(不)属于指定字符集的字符串长度strpbrk()
搜索指定字符集的任一个字符strstr()
在一个字符串里面,查找另一个字符串strtok()
将一个字符串按照指定的分隔符分解strcoll()
比较本地化设置的字符串strxfrm()
将一个本地化字符串转成可以使用strcmp()进行比较的形式strerror()
函数返回特定错误的说明字符串memcpy()
内存复制函数memmove()
内存复制函数(允许重叠)memcmp()
比较两个内存区域memchr()
在内存区域中查找指定字符memset()
将一段内存全部格式化为指定值