跳转至

概要


更新于 2023-11-22

版本

版本 时间 组织
c89 1989 ANSI
c90 1990 ISO
c99 1994 ANSI/ISO
c11 2011 ANSI/ISO
c17 2017 ANSI/ISO

默认版本查询

  • 查询当前gcc版本
  • gcc官网查询对应版本手册

查询支持版本

Bash
1
2
3
4
5
6
gcc -E -dM - </dev/null | grep "STDC_VERSION"
#输出结果和 C 标准的对应关系如下:
#define __STDC_VERSION__ 199901L,则默认支持的是 C99 标准;
#define __STDC_VERSION__ 201112L,则默认支持的是 C11 标准;
#define __STDC_VERSION__ 201710L,则默认支持的是 C17 标准;
#如果没查到,则默认支持的是 C89 标准。

指定版本

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#使用`-std`参数进行指定:
#-std=c11        # Conform to the ISO 2011 C standard
#-std=c89        # Conform to the ISO 1990 C standard
#-std=c90        # Conform to the ISO 1990 C standard
#-std=c99        # Conform to the ISO 1999 C standard
 #-std=gnu11      # Conform to the ISO 2011 C standard with GNU extensions
#-std=gnu89      # Conform to the ISO 1990 C standard with GNU extensions
#-std=gnu90      # Conform to the ISO 1990 C standard with GNU extensions
#-std=gnu99      # Conform to the ISO 1999 C standard with GNU extensions

编码原则

  • 代码应当易于理解。
  • 代码的写法应当使别人理解它所需的时间最小化。
  • 把信息装入名字中。不易误解的名字。
  • 布局一致。
  • 让相似的代码看上去很相似。
  • 把相关的代码分组。
  • 注释的目的是尽量帮助读者了解的和作者一样多。

编码流程

  • 定义程序的目标
  • 设计程序
  • 编写代码
  • 编译
  • 运行
  • 测试和调试
  • 维护和修改 要编写的程序越复杂,事先定义和设计程序的工作量越大。

标识符

  • 文件名全小写
  • 全局变量使用 g_
  • 静态变量使用 s_
  • 名词或形容词+名词定义变量
  • 动作+名字定义函数

注释

注释别名 用途
TODO 未处理的事情
FIXME 已知的无法运行的代码
HACK 对于一个问题不得不采用比较粗糙的解决办法。
XXX 危险,这里有个重要的问题。

变量

一个变量只有一个功能,不能把一个变量用作多种途径。
不要设计面面俱到的数据结构。
简化逻辑和循环的参数

左边 右边
变化的值 常量

函数

  • 一个函数仅完成一件功能。
  • 重复代码提炼成函数。
  • 一般行数不超过50
  • 嵌套少于4.
  • 缺省调用者检测参数。
  • 对函数错误返回码要全面处理。
  • 除了对外接口,全加static关键字。

头文件

  • 头文件中适合放置接口的声明,不适合放置实现。
  • 头文件应当职责单一。
  • 头文件应向稳定的方向包含。