(更新中...)

资料

语法

头文件

  • ANSI C标准共定义了 15 个头文件,称为“C标准库”,所有的编译器都必须支持,依据使用频率分级:
    初级:<stdio.h>、<ctype.h>、<stdlib.h>、<string.h>
    中级:<assert.h>、<limits.h>、<stddef.h>、<time.h>
    高级:<float.h>、<math.h>、<error.h>、<locale.h>、<setjmp.h>、<signal.h>、<stdarg.h>

构造函数

C++11版本之后,推荐使用大括号{}赋值构造函数,使用{}赋值的好处(advantages):

  • 在大多数情况,都可以直接使用(Works in most contexts)
  • 没有隐式构造(区别于使用 = 构造)
  • 参考资料

C++ Braced Initialization
Brace initialization of user-defined types

二进制文件的读写

编译

资料

编译器

参照百度百科的定义,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)

在Linux下,通常使用GCC编译器,它包含 gcc和 g++(注意GCC与gcc是不同的东西)。gcc和g++在编译时,对编译选项的解释是不同的,会调用不同的过程去编译c和cpp文件

  • gcc会将c和cpp分别按c语法和c++语法编译
  • g++会将c和cpp文件统一使用c++语法编译并链接STL库,具体区别可以参见[linux公社 - gcc与g++ 详解]:

编译步骤

  预处理(Preprocessing) -> 编译(Compilation) -> 汇编(Assemble) -> 链接(Linking)

链接库

静态库(static library)、动态库/共享库(shared library)

  • 生成静态库libtest.a
    ar rcs libtest.a test.o
  • 链接静态库libtest.a
    gcc test_main.o -o test.exe -L./ -I./ -ltest

/usr/bin/ld搜索路径

静态库链接时搜索路径顺序

  • ld会去找GCC命令中的参数-L
  • gcc的环境变量LIBRARY_PATH
  • 内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

动态链接时、执行时搜索路径顺序:

  • 编译目标代码时指定的动态库搜索路径
  • 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
  • 配置文件/etc/ld.so.conf中指定的动态库搜索路径
  • 默认的动态库搜索路径/lib
  • 默认的动态库搜索路径/usr/lib

有关环境变量

  • LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径

参考资料:

编译选项

-fsanitize

检查内存泄漏、内存重复释放、悬垂指针等

CMake编译

调试

工具

[1]linux公社 - gcc与g++ 详解
精简版本