【专题】C/C++ 编程语言

2010-11-12 topic language c/cpp

C 语言

在 1989 年,美国国家标准协会 (ANSI) 对 C 语言进行了标准化,此时 C 语言又被称为 ANSI C。在一年后被国际标准化组织 ISO 采纳,所以 C 语言在 ISO 中有了一个官方名称 ISO/IEC 9899:1990 ,其中 9899 是 C 语言在 ISO 标准中代号 (C++ 是 14882),冒号后面的 1990 表示当前修订好的版本是在 1990 年发布。

所以,最开始的 C 语言标准也被称为 C89、C90 或者 C89/C90,后续又在 1999、2007、2011 进行了改进。另外,C++ 在从 C++11 之后,基本固定每三年发布一个新版本。

  • 整数介绍 包括了类型提升、整型溢出等。
  • 宏使用 一些基本使用规则,以及常见注意事项。
  • 数据对齐 结构体以及内存的对齐方式。
  • 指针简介 包括了基本概念、函数指针等概念的介绍。
  • 位域和字节序 位域或位段相关概念,以及大小端字节序相关的内容。
  • inline 简介 有点类似于 C 中的宏,但是又有所区别。
  • Volatile 简介 C 语言中与 volatile 相关的介绍。

基本概念

不只是 C 相关代码,实际上更多的是 Linux 中的基本介绍。

程序加载

详细介绍从 Bash 启动运行,到最终调用到函数执行。

  • 加载过程 包括从 Bash 到内核加载,再到用户态的 ld 加载解析,也可以通过 API 加载包含使用注意事项。
  • Preload 简介 允许应用在加载其它动态库之前先加载,可以用来替换某些函数。
  • PLT GOT 介绍 介绍动态库在运行过程中如何寻找到函数的地址,这里会讨论实现的机制、风险等。

网络编程

  • 基础技巧 简单介绍在 Linux C 中进行网络编程时常用到的一些技巧。
  • 端口使用 一般客户端无需指定端口,如果需要也可以指定,注意不要冲突。
  • UDP 通讯优化 UDP 并非一个面向连接的协议,与 TCP 不同,有其相关的优化方法。
  • 多路复用 通过 IO 多路复用提高系统性能,包括了 select、poll、epoll 。
  • Socket 关闭方式 主要介绍了通过 close() 以及 shutdown() 方式关闭 Socket 。
  • socketfs 内核中用户程序与网络协议栈之间的接口层。

GCC 相关

  • 特性定制 对函数、告警等选项的定制,主要是 pragma、attribute 属性的介绍。
  • 常用技巧 常用的参数、64位编译32位代码等等。

Test

测试主要是为了可以提前发现异常,尤其是当重构时,可以进行完整的验证,所以,就慢慢衍生出了所谓 Test Drived Develop, TDD,而且产生了很多测试方法。

  • 代码覆盖率 使用 GCC 自带的工具可以很简单的统计代码覆盖率。
  • 竞态检查 一些常见的 Sanitizer 介绍,包括其原理。
  • 单元测试 编译过程中提供了强弱符号的概念,可以用于类似单元测试的场景。
  • Fuzzing 测试 也就是模糊测试,介绍一些基本原理以及使用方法。
  • Fail Points BSD 中的一种构造异常的测试机制。

其它

  • 特性宏 除了提供基础的 C 语言实现库,另外比较关键的是通过宏在编译阶段适配不同环境。
  • 浮点数 计算机中所有的数据都是以二进制方式保存,包括浮点数,会导致精度有问题。
  • 常用函数 包括了qsort、bsearch、backtrace、atexit 等函数。
  • 内联汇编 GNU 中如何所用内联汇编。
  • 信号安全 一般会在信号处理里打印日志,不过也可能会因此导致发生死锁。
  • 安全编译 GCC 提供的一系列安全编译的选项,简单介绍。
  • 错误信息 C 中在打印错误信息的时候应该注意那些。
  • Umask 使用 通过 umask 可以在不修改代码直接调整文件的默认打开权限。
  • 替换 malloc 简单介绍如何替换掉 glibc 中的一系列内存相关函数。
  • 字符串操作 与字符串相关的函数,例如格式化、查找、转换等等,还可以参考 正则表达式
  • 易错知识点 整理记录了容易混淆、犯错的地方,有些会有点偏。
  • 奇技淫巧 整理下 C 语言中常用的技巧。
  • 通配符 也就是 Linux 中与通配符相关的内容。
  • 数据压缩 常见的如 zlib、snappy 等压缩算法,这里仅介绍代码使用。
  • C11 标准解读 常见的一些新标准支持的特性。
  • AIO 简单介绍下 Linux 平台下的异步读写模型。
  • 版本发布 整理下 C 语言中调试、发布的流程,以及相关注意事项。

CPP

可以认为是在 C 的基础上添加了面向对象的功能,其编译、链接、调试等基本都可以通过一个工具链完成。

  • 基本概念 介绍基本的语法,例如封装、继承、多态、多线程等等。
  • 构造析构 在对象内存申请完之后会通过构造函数初始化,不同场景包含了多种构造函数。
  • 强制转换 按照不同的场景提供了不同的类型转换方法,这样在异常是可以及时发现。
  • 右值引用 这是 C++11 中引入的特性,可以避免非必要拷贝、模板按类型转发。
  • 智能指针 C/C++ 需要自己管理内存,如果管理不当很容易造成泄漏,通过智能指针可在一定程度上降低。
  • 调用对象 通过可调用对象覆盖了函数指针、函数、lambda 等。
  • 常见问题 整理一些常见的错误示例。

其它

  • STL 使用 提供了通用的模板类和函数,这里整理常用的示例。

常用工具

  • BenchMark Google 提供的性能压测工具,还包括单元测试 GTest、Mock 测试套 GMock、命令行解析 GFlags 等。
  • CRC 循环冗余校验,通常用于网络、文件等校验。
  • Breakpad 跨平台的 Crash 状态收集工具。
  • CMocka 在 C 语言中使用的 Mock 库。

参考

  • Awesome CPP 一些经典常见的工具、库等。
  • CPP Reference 整理了很多 C/C++ 的规范,可以查询一些常见的基本概念。
  • Compiler Explorer 可根据不同编译器版本进行编译,并查看其汇编代码,以此判断编译器对代码影响,例如并发编程。

编译链接

  • 编译链接链接顺序 静态库的不同顺序会影响最终二进制的生成,这里简单介绍。
  • 二进制接口 用来约束二进制调用接口,是编译器和连接器需要遵守的规则。
  • 强弱符号 编译过程中提供了强弱符号的概念,可以用于简单的覆盖。
  • 工具解析 介绍一些在 Linux 常用的二进制解析工具,例如readelf、nm、ldd等。

自动编译

其中 CMake 在后续详细介绍,这里仅介绍一些其它常用的。

  • Makefile 也就是最基本的 Makefile ,其它工具一般最后都是生成该文件。
  • AutoTools 比较老也是比较经典的自动编译工具。
  • Package 管理 Linux 提供的一种工具,通常在动态库编译时的参数配置。

CMake

这是一个跨平台的自动编译、打包工具,可以通过简单语句描述编译过程,可以输出对应的 Makefile 文件。

  • 简单介绍 只是简单介绍如何使用,包括了安装、示例等。
  • 测试用例 已介绍如何对 C 进行测试,包括代码覆盖率,实际也可以通过 CMake 直接生成测试结果。
  • 常用示例 整理一些常见的使用场景,例如依赖。

Linux 编程

在 Linux 环境下会有不同的实现。

  • 网络编程 网络编程中的基本概念,例如结构体、域名解析、IP 地址等。
  • 进程创建 Linux 中有多种子进程的创建方式,这里详细介绍其用法。
  • 动态参数 在函数传参过程中允许使用多个动态参数,这里介绍如何使用以及其原理。
  • Direct IO 可以直接在应用层和磁盘之间建立通道,减少上下文切换次数。

libev

libev 是一个基础的高性能事件库,提供了跨平台能力,而且代码很少,使用非常灵活。除了基础的 IO、定时器、信号的处理之外,同时还提供了一些循环中经常使用的 hook 处理。

还可以参考 libevent 使用。

  • 基本介绍 一个简单而且高性能的事件库,支持常规的 IO、定时器等事件,同时支持多线程模式。
  • 源码实现 大致介绍核心逻辑的源码实现方案,同时包含一些常用的事件模块实现。
  • 时间处理 简单介绍下 libev 库中与时间相关的内容。
  • 信号处理 信号的处理非常敏感,如果处理不当很容易出现问题。

内存检查

  • Valgrind 一个工具集,可以进行一类的调试、分析、测试,以帮助完善程序。
  • 其它工具 介绍一些 Linux 中使用的其它工具,例如 mtrace 等。

GDB

GDB 是一个很强大的调试工具,支持远程调试、嵌入式调试、输出的重定向。

  • 基本介绍 简单介绍其常用的功能,包括 watchpoint、catchpoint 等内容。
  • 调试格式 这里对标准的 DWARF 格式进行详细介绍。
  • 栈帧分析 栈是一块内存空间,会从高地址向低地址增长,用于保存临时变量、传参等。
  • 初始脚本 启动时会默认加载初始化脚本,通常是部分命令配置以及一些复杂函数。
  • Python脚本 在 7.X 之后的版本中增加了 Python 脚本支持,比之前的 DSL 实现要强大很多。
  • 死锁分析 简单介绍如何通过 gdb 处理代码中的死锁。
  • 常用命令 整理常用的命令,也就是 Cheatsheet 命令集。

常用实现

  • flock 通常用于单进程应用的检查,可以有效确保只有单个进程使用。
  • core 在 Linux 中可以用来生成 CoreDump 文件,用来异常问题定位。
  • gettext 用来在 C 语言中通过 gettext 实现多语言编程。
  • uuid 用在分布式系统中生成唯一的 ID 标识。
  • getopt 用于命令行的参数解析,包括了短参和长参。
  • zeromq 非常简单好用的传输层实现,使得 Socket 编程更加简单高效,包括 架构设计

编程技巧

词法语法解析

Lex (A Lexical Analyzer Generator) 和 Yacc(Yet Another Compiler Compiler) 是 UNIX 中两个非常重要的、功能强大的工具,分别用来做词法扫描以及语法分析。

在 Linux 上就是 flex-bison,其中在使用 bison 时,采用的语法必须是上下文无关文法 (context-free grammar)。

这里简单介绍,包括常规表达式、声明、匹配模式、变量、Yacc 语法和解析器代码。

  • 基本概念 关于词法语法分析的基本概念,例如 BNF、上下文无关等。
  • Flex 使用简介 词法解析器的介绍,在 Linux 中的实现。
  • Bison 使用简介 语法解析器的介绍,Linux 中对应 Yacc 的实现。
  • MySQL 语法解析 MySQL 中使用方式,词法解析独立实现,语法分析则使用 Bison 。

时间相关

人们对于时间的认知随着时间的变化一直在变,包括各个地区古代的历法,以及最新的原子钟,而且现代仍然有闰秒、冬令时、夏令时等等各种概念。

在 Linux 系统中,包括了时区的设置、时间的同步、闰秒的影响等等。

  • 基本概念 与时间相关的基本概念以及设置,例如时区、闰秒、夏令时等。
  • 时间函数 介绍下 Linux 中与时间相关的函数以及如何选择。
  • NTP 介绍 主要是一些基本概念、如何配置等介绍。
  • 闰秒介绍 一些与闰秒相关的介绍,包括了基本概念、如何规避等。

LLVM

最初是 Low Level Virtual Machine 的缩写,不过随着发展,逐渐整合成了一整套的编译工具,所以官方也就放弃了原有的缩写,而修改成 The LLVM Compiler Infrastructure 。

其强大之处在于模块化,可以很方便适配不同的语言以及硬件平台。

logo
  • 基本介绍 这里简单介绍其常见的使用方法,包括安装、常用命令等。