// ===== CodeLab: C17 与 C23 新特性:从缺陷修复到现代 C =====
// 来源: https://aoerliang.dpdns.org/articles/c23-features
// 以下代码片段按文章出现顺序拼接, 共 5 段

// ----- 片段 1 (c) -----
// C23 之前:bool 依赖头文件
#include <stdbool.h>
bool old_way = true;

// C23:bool / true / false 是关键字,无需头文件
bool ok = true;
bool failed = false;

// typeof:推导类型
typeof(3 + 4) x = 7; // int x
typeof(x) arr[4];    // int arr[4]

// nullptr:明确的空指针常量
int *p = nullptr;

// ----- 片段 2 (c) -----
// constexpr:编译期常量对象
constexpr int SIZE = 1024;
int buffer[SIZE]; // 普通数组,不是变长数组

// 检查整数溢出
#include <stdckdint.h>
int a = 2000000000;
int b = 2000000000;
int sum;
if (ckd_add(&sum, a, b)) {
    puts("溢出!"); // 会走到这里
}

// ----- 片段 3 (c) -----
#include <stdio.h>

// 二进制字面量 + 数字分隔符
int mask = 0b1010_0101; // 165
long budget = 1'000'000;

// 属性:返回值不可丢弃
[[nodiscard]] int open_file(const char *path) {
    return path[0] != '\0' ? 0 : -1;
}

int main(void) {
    int fd = open_file("data.txt");
    if (fd < 0) {
        puts("打开失败");
    }
    return 0;
}

// ----- 片段 4 (c) -----
// #embed:把二进制文件内容直接嵌入
// 需要 GCC 15+ 或 Clang 19+
const unsigned char icon[] = {
    #embed "icon.bin"
};

// 更简洁的条件编译
#ifdef DEBUG
    #define LOG(...) printf(__VA_ARGS__)
#elifdef RELEASE
    #define LOG(...) ((void)0)
#endif

// ----- 片段 5 (c) -----
/* 查看编译器宣称支持的标准版本 */
/* echo | gcc -std=c23 -dM -E - | grep __STDC_VERSION__ */
/* 输出 __STDC_VERSION__ 202311L 表示支持 C23 */
