简介
截止2026年8月,C语言最新的正式标准是 C23(ISO/IEC 9899:2024)。它也被称为C2x,是自C11/C17以来的一次重大更新,引入了众多旨在提升语言安全性、表达力与现代化程度的新特性。

同时,下一个版本 C29(代号C2y)的制定工作也已启动。
📜 C标准演进简史
了解C23的定位,需要先回顾C语言标准的演变。下图清晰地展示了各主要标准及其核心变化:
🚀 C23:核心新特性与示例
C23是一次重大更新,以下是一些最值得关注的新特性。
1. 更安全的空指针:nullptr
C23引入了 nullptr 关键字和 nullptr_t 类型,用以替代传统的 NULL 宏,提供更强的类型安全。
#include <stddef.h> // nullptr_t 在此定义
void process(int *ptr) {
if (ptr == nullptr) { // 明确地检查空指针
// 处理空指针情况
}
}
int main() {
int *p = nullptr; // 用 nullptr 初始化指针
process(p);
return 0;
}
2. 编译时计算:constexpr
constexpr 说明符可确保变量在编译时求值,有助于优化和类型安全。在C23中,constexpr 指针必须初始化为 nullptr。
constexpr int MAX_SIZE = 1024; constexpr int BUFFER_SIZE = MAX_SIZE * 2; // constexpr 指针只能指向 nullptr constexpr int *p = nullptr;
3. 类型推导:typeof 与 typeof_unqual
typeof 运算符能获取表达式的类型,用于声明或类型转换。typeof_unqual 则能移除 const、volatile、restrict 等限定符。
int a = 10; typeof(a) b = 20; // b 的类型是 int const int c = 30; typeof_unqual(c) d = 40; // d 的类型是 int (const 被移除)
4. 二进制字面量与数字分隔符
直接书写二进制数(0b/0B前缀),并可用单引号(')分隔数字,提升长数字的可读性。
int mask = 0b1010'1100'1111'0001;
5. 属性(Attributes)
使用 [[ ]] 双中括号语法向编译器传递特定信息。例如,[[nodiscard]] 提醒调用者不应忽略返回值。
[[nodiscard]] int calculate() {
return 42;
}
int main() {
calculate(); // 若忽略返回值,编译器将产生警告
return 0;
}
6. 预处理指令 #embed
#embed 指令允许在编译时直接将二进制文件内容包含到程序中作为数组。
// 将 "data.bin" 文件内容作为 unsigned char 数组包含进来
const unsigned char data[] = {
#embed "data.bin"
};
7. 其他重要语言改进
-
auto:其语义被重新定义为“自动类型推导”,与C++类似。 -
枚举:可为枚举类型指定底层类型。
-
bool/true/false:成为正式关键字,不再需要包含<stdbool.h>。 -
精确宽度整数:引入
_BitInt(N),可定义任意位宽的整数。
🏛️ C23:标准库增强
-
stdckdint.h:提供用于检查整数溢出(Checked Integer Arithmetic)的函数。 -
stdbit.h:提供用于位操作(如循环移位、统计位1个数)的实用函数。 -
memalignment:用于查询指针所指向内存的对齐方式。 -
memset_explicit:一个更安全的内存设置函数,旨在防止编译器优化掉敏感的内存清除操作。 -
char8_t:用于UTF-8字符和字符串的类型别名。 -
移除与废弃:移除了K&R风格的函数声明和
realloc(zero_size)的特定行为;废弃了asctime和ctime等函数。
🛠️ 如何启用C23支持
主流编译器已提供对C23的实验性或部分支持:
-
GCC:从 GCC 14 开始支持部分C23特性,GCC 15 及更高版本支持更完善。
-
Clang:从 Clang 15 开始支持部分C23特性,Clang 19 及更高版本支持更完善。
编译时需指定标准,例如:gcc -std=c23 your_program.c 或 clang -std=c23 your_program.c。
其他
C23标志着C语言在现代化道路上的重要一步。对于开发者来说,开始了解并逐步在项目中采用C23的新特性,将有助于编写更安全、更清晰、更高效的代码。
| 标准 | 年份 | 重点 |
|---|---|---|
| C89(C90) | 1989 | 基础 C 语言 |
| C99 | 1999 | stdint.h、bool、变长数组 VLA、_Generic、指定初始化器 |
| C11 | 2011 | 原子、多线程、静态断言_Static_assert、泛型_Generic |
| C17 | 2018 | 仅缺陷修复,无新语法 |
| C23 | 2024 | nullptr、auto、typeof、_BitInt、[[属性]]、ckd 溢出检查、memset_explicit、#embed |
C23 不会改变 C“简单、底层、无 GC” 的定位,主要解决历史坑,增加安全工具。
常见坑提醒
- C23 的
auto不是 C++auto,仅限局部变量,必须初始化; _BitInt、_DecimalXX属于可选特性,不是所有硬件平台编译器都实现;#embed二进制嵌入,部分编译器版本支持不全;void f();含义变更,老项目迁移注意。