C11:原子、线程与编译期检查
C11 在保留 C99 基础的同时,建立了标准化的内存模型与并发接口,并补充类型泛型、静态断言和对齐控制。
参考官方标准:WG14 N1570:C11 最终委员会草案
代表变化
_Atomic与<stdatomic.h>:原子对象和内存顺序。<threads.h>:线程、互斥量、条件变量和线程专用存储。_Thread_local:线程局部存储期。_Generic:根据表达式类型进行编译期选择。_Static_assert:编译期约束检查。_Alignas/_Alignof与<stdalign.h>:显式对齐控制。- 匿名结构体、匿名联合体以及更完整的 Unicode 字符支持。
编译期类型选择
c
#include <stdio.h>
#define type_name(value) _Generic((value), \
int: "int", \
double: "double", \
char *: "char pointer", \
default: "other")
int main(void) {
_Static_assert(sizeof(char) == 1, "C requires one-byte char objects");
printf("%s\n", type_name(42));
printf("%s\n", type_name(3.14));
return 0;
}_Generic 不会在运行时进行动态类型判断;它由编译器根据控制表达式的类型选择分支,常用于构建类型安全的宏接口。
原子计数器
c
#include <stdatomic.h>
static atomic_uint request_count = 0;
void record_request(void) {
atomic_fetch_add_explicit(&request_count, 1, memory_order_relaxed);
}原子操作解决的是并发访问的数据竞争问题,不等于自动保证整个业务操作的事务性。选择内存顺序前仍需先建立清楚的同步关系。
下一版:C17 / C18。
版本信息与迁移
- 发布时间 / 标准时间: 2011 年
- 维护状态: 截至 2026-08-27,以页面所链接的官方生命周期或规范状态为准
- 运行时或平台基线: 编译器对目标 ISO C/C++ 标准及所用标准库的实现支持
迁移影响: 升级构建标准前,必须在全部目标编译器上开启对应 -std= 选项,处理被收紧或删除的语法、标准库差异和 ABI 边界,并保留旧工具链回归构建。
版本确认
bash
gcc --version
clang --version资料核对日期:2026-08-27。