C语言正式标准 C23(ISO/IEC 9899:2024)

C/C++ wes 2 days ago (2026-08-09) 13 views
📑 本文导航

简介

截止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 宏,提供更强的类型安全。

c
#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

c
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 则能移除 constvolatilerestrict 等限定符。

c
int a = 10;
typeof(a) b = 20; // b 的类型是 int
const int c = 30;
typeof_unqual(c) d = 40; // d 的类型是 int (const 被移除)

4. 二进制字面量与数字分隔符

直接书写二进制数(0b/0B前缀),并可用单引号(')分隔数字,提升长数字的可读性。

c
int mask = 0b1010'1100'1111'0001; 

5. 属性(Attributes)

使用 [[ ]] 双中括号语法向编译器传递特定信息。例如,[[nodiscard]] 提醒调用者不应忽略返回值。

c
[[nodiscard]] int calculate() {
 return 42;
}
int main() {
 calculate(); // 若忽略返回值,编译器将产生警告
 return 0;
}

6. 预处理指令 #embed

#embed 指令允许在编译时直接将二进制文件内容包含到程序中作为数组。

c
// 将 "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” 的定位,主要解决历史坑,增加安全工具。

常见坑提醒

  1. C23 的auto不是 C++auto,仅限局部变量,必须初始化;
  2. _BitInt_DecimalXX属于可选特性,不是所有硬件平台编译器都实现;
  3. #embed二进制嵌入,部分编译器版本支持不全;
  4. void f();含义变更,老项目迁移注意。