Skip to content

C语言进阶

编译

  • gcc/g++
    • 编译过程
      1. 源码 .c/.h
      2. 预处理 .i 找头文件 展开宏
      3. 编译 .s 错误发生处 汇编
      4. 汇编 .o g++ -c name.c生成
      5. 链接 .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 + B
    • isprint() 是否为可打印字符
    • 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"=>123
    • long 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() 可变参数操作函数
  • 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() 将一段内存全部格式化为指定值