跳转到正文

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。

Released under the MIT License.