浅析C语言标准及特性

📅 2026/7/3 19:04:38
浅析C语言标准及特性
文章目录概述C标准发展历程GCC编译器扩展ANSI C标准ANSI C标准关键字C99标准C99新增关键字C99新增特性语法与变量定义预处理与编译内置新增标准头文件与类型标准库与格式化输出C11标准C11新增关键字C11新增特性语法与类型扩展并发、原子、多线程标准库变更与安全优化预处理与兼容性调整C23标准C23标准新增关键字相关参考概述C语言发展之初并没有正式的标准。1978年布莱恩•柯林汉和丹尼斯•里奇合著的C语言程序设计》第一版被公认为是C语言最早的标准通常也被称为KR C。随着C语言的不断发展第一个C语言正式标准即ANSI C于1989年发布这是目前使用最广泛的版本也称C89。后续C标准继续修订并加入新的特性陆续又发布了C99、C11等标准最新的C标准已经到了C23。C标准发展历程C标准发展史编排如下C标准发布时间描述ANSI C1989由美国国家标准协会ANSI开发定义了C语言和C标准库也称C89ISO C1990由国际标准化组织ISO发布是与ANSI C完全相同的标准也称C90C991999C标准委员会对C语言不断改进并收纳为新的标准于1999年正式发布简称C99也是严格意义上C语言的第二个正式版本C112011C标准委员继续对C语言进行改进并收纳为新的标准于2011年正式发布简称C11C17/C182017C17/18主要是C11标准错误的修正无新特性引入于2017年发布C232023现代化C语言也是最新的C语言标准简化语法增强安全同时删除了大量旧时的特性于2023年发布GCC编译器扩展除了C语言官方发布的标准例如GCC编译器也会提供额外的非标准语言特性支持这些扩展特性被加入到了编译器的选项中可以由用户指定编译选项进行使用。GCC编译器的C标准实现包括gnu89、gnu99、gnu11等可以统称为GNU C标准本质上就是对应版本的C语言标准特性编译器扩展特性的合集。关于GNU C标准的扩展特性可以通过查看GCC工具手册进行了解编程人员可以通过制定-std选项来选择特定的标准使用。ANSI C标准作为C语言的第一个正式标准ANSI C定义了C语言的基础语言特性以及标准库相关的内容。ANSI C包含的语言特性如下关键字ANSI C一共定义了32个关键字包含数据类型、存储类别等是C语言初代标准关键字集合。语法基础定义了分支、循环、跳转等基础语句语法支持指针、数组、函数以及预处理等功能C语言标准库ANSI C标准关键字关键字描述auto声明自动局部变量默认存储类别break跳出循环或switch分支caseswitch语句分支匹配标签char字符基础数据类型const修饰只读常量变量不可修改continue终止当前本轮循环直接进入下一轮循环defaultswitch分支无匹配时执行的默认分支dodo-while循环起始标识double双精度浮点数据类型elseif条件不满足时执行的分支enum定义枚举自定义数据类型extern声明外部全局变量或外部函数float单精度浮点数据类型forfor循环语句关键字goto无条件跳转到代码自定义标签处if条件判断语句关键字int基础整型数据类型long长整型修饰符扩大数值存储范围register建议编译器将变量存入CPU寄存器提升读取速度return函数返回数据终止当前函数运行short短整型修饰符缩小整型占用字节signed有符号修饰符变量可存储正负数值sizeof单目运算符计算类型/变量占用内存字节数static静态修饰局部变量生命周期延长全局变量仅当前文件可见struct定义结构体复合数据类型switch多分支条件匹配语句typedef为已有数据类型自定义别名union定义共用体联合体数据类型unsigned无符号修饰符变量仅存储非负数void空类型无返回值、无函数参数、通用空指针volatile禁止编译器优化该变量变量值可能被硬件/外部程序修改whilewhile循环、do-while循环尾部条件判断C99标准C99新增关键字C99标准新增5个关键字inline、restrict、_Bool、_Complex、_Imaginary各个关键字的含义如下关键字含义inline用于指示编译器尽可能地将inline修饰的函数指令在被调用的地方展开restrict用于指针修饰表明该指针是访问其管理数据的唯一方式_BoolC99新增_Bool类型用于表示布尔值对应于逻辑值true和false_Complex复数类型_Imaginary虚数类型C99新增特性语法与变量定义特性描述// 单行注释标准化C89仅编译器扩展C99正式纳入标准代码块任意位置定义变量C89仅允许在代码块起始处定义变量for循环头部定义局部变量在for()内声明变量作用域仅循环内部long long / unsigned long long64位整型配套 LL、ULL 数值后缀变长数组 VLA数组长度使用运行时变量栈内存分配复合字面量临时构造数组、结构体等匿名对象指定初始化结构体/数组按成员名赋值无需按顺序灵活数组成员结构体末尾无长度数组适配动态内存分配空大括号零初始化 {}数组、结构体支持空括号整体清零VLA函数形参 int arr[*]变长数组函数声明简写语法复合字面量可作为返回值临时结构体、数组可直接return返回弱化隐式int规则无返回类型函数默认int被标记为过时写法预处理与编译内置特性描述可变参数宏VA_ARGS宏定义支持不定数量输入参数func内置标识符字符串常量自动存储当前函数名称十六进制浮点常量支持 0x1.2p3 格式浮点数字面量新增标准头文件与类型特性描述stdint.h提供固定位宽整数uint8_t、int32_t等stdbool.h封装 bool、true、false 简化布尔编码tgmath.h 泛型数学库同一函数自动适配 float/double 浮点类型wchar.h 宽字符库统一宽字符、多字节字符转换接口标准库与格式化输出特性描述%zu、%td 格式化占位符分别用于打印 size_t、ptrdiff_t 类型新增大量数学库函数round、erf、tgamma、nearbyint 等浮点函数C11标准C11新增关键字C11标准新增7个关键字Alignas、_Alignof、_Noreturn、_Generic、_Thread_local、_Atomic、_Static_assert各个关键字含义如下:关键字描述Alignas内存对齐的操作符与_Alignof配合使用指定结构的对齐方式_Alignof获取类型和变量的对齐方式_Noreturn修饰函数不会返回值_Generic泛型函数_Thread_local线程局部存储限定了变量不能在多线程之间共享_Atomic原子操作_Static_assert编译期间断言C11新增特性语法与类型扩展特性描述匿名结构体 / 匿名联合体结构体内部无名称的嵌套结构可直接访问内层成员简化协议、寄存器定义max_align_t代表系统基础类型最大对齐粒度malloc 分配内存默认满足该对齐变长数组VLA改为可选特性C99强制支持C11标准改为可选编译器可选择不实现并发、原子、多线程特性描述threads.h 多线程标准库标准化线程创建、互斥锁、条件变量、一次性初始化stdatomic.h 原子操作库原子类型、原子读写、内存序无锁并发编程标准接口标准化内存模型定义多线程数据竞争、可见性、执行顺序规则thrd_t、mtx_t、cnd_t线程、互斥锁、条件变量标准类型call_once 一次性执行保证一段代码在多线程环境仅执行一次用于单例初始化标准库变更与安全优化特性描述彻底移除 gets()存在严重缓冲区溢出漏洞永久删除推荐 fgetsfopen 新增独占模式 “x”fopen(“a.txt”, “wx”)文件不存在才创建防止覆盖已有文件新增安全边界字符串函数strnlen、strndup 等限制操作长度避免越界快速退出 quick_exit()不执行静态对象析构、仅注册atexit_at_quick回调快速终止程序at_quick_exit()注册 quick_exit 触发时执行的回调函数预处理与兼容性调整特性描述移除隐式函数声明支持调用未声明函数强制警告/报错杜绝未定义行为支持UTF-8字符字面量 u8原生UTF-8字符串常量区分于宽字符修复复合字面量、初始化边界定义统一数组、结构体初始化未定义填充规则C23标准C23标准新增关键字关键字功能描述nullptr标准空指针常量类型为 nullptr_t区分整数0static_assert升级为关键字替代 C11 的_Static_assert无需头文件bool内置布尔关键字无需包含stdbool.htrue布尔真值字面量内置关键字false布尔假值字面量内置关键字typeof编译期获取表达式/变量的类型简化泛型代码loop标签循环配套关键字支持带标签break跳出外层循环相关参考《C Primer Plus》《C语言深度剖析》