当前位置: 首页 > news >正文

现代C语言:C23标准重大更新

虽然没有固定标准,但一般将C99之后的C语言标准称为“现代C语言”,目前的最新标准为C23。C语言的演化包括标准C89、C90、C99、C11、C17和C23,C23是C语言标准的一次重大修订,截至2024年3月,最新版本的gcc和
clang实现了C23的大部分新语言功能,但是部分功能仍然缺失,例如:constexpr 存储类说明符,[[unsequenced]][[reproducible]] 属性等等。
以下是比较重要的变化,完整变化列表可以参阅https://en.cppreference.com/w/c/23或ISO标准文档。

1. 替代

<assert.h>中的static_assert()宏被替代,变成了static_assert关键字;
<threads.h>中的thread_local()宏被替代,变成了thread_local关键字;
<time.h>中的ctime()函数弃用,请使用ctime_s()替代;
<time.h>中的asctime()函数弃用,请使用asctime_s()替代;
<stdnoreturn.h>_Noreturn标识符均弃用;
<stdalign.h>中的alignas()alignof()宏被弃用,请直接使用_Alignas_Alignof关键字;

2. 新增

C23新增了三个十进制浮点数数据类型(关键字):_Decimal32_Decimal64_Decimal128,对应的后缀是DFDDDL。它们的最大值分别如下:

DEC32_MAX 9.999999E96DF
DEC64_MAX 9.999999999999999E384DD
DEC128_MAX 9.999999999999999999999999999999999E6144DL

C23可以使用二进制字面量了,使用0b或者0B开头,例如:

int num = 0b1011;

C23的字面量可以加分隔符了,增强可读性,例如:

int num2 = 100'020'050;

C23添加了booltruefalse三个关键字,可以像C++一样定义布尔类型了:

bool choice = true;

C23新加了nullptr关键字,它是nullptr_t类型的,可以被强制转换为任意指针类型(传统空指针)及布尔类型(可用于逻辑判断):

void func(int a, nullptr_t b) {//...
}func(10, nullptr);int *a = nullptr;if(!a) {printf("A is nullptr");
}

C23添加了双括号属性(Attributes)了,常用的比如:

[[deprecated]]
[[nodiscard]]
[[noreturn]]
[[maybe_unused]]

C23新加了一些预编译命令,常用的比如:

#elifdef
#elifndef
#warning:让编译器抛出警告
#embed:让编译器直接内嵌二进制数据
static const char song[] = {#embed <music.wav>  // 内嵌二进制文件数据
};

C23增加了空初始化列表支持,也就是说:

int a[5] = { 0 };
// 可以直接写成
int a[5] = {};
// 等价于
int a[5] = { 0, 0, 0, 0, 0 };

C23的宏支持__VA_OPT__了,能更方便地解决使用宏时末尾符号的问题

C23给<stdio.h>中的printf()函数添加了%b%B支持,能像打印16进制(%x %X)一样直接打印二进制数据了;scanf()也增加了%b支持

C23给<string.h>增加了memccpy(),与memcpy()类似但遇到某个特定值时会立刻停止复制

C23给<string.h>增加了strdup()strndup(),用于复制出一个新的(部分)字符串

C23引入了函数定义时的匿名参数,如果一个参数因为某种原因必须被传递但却不被使用,就可以把它设置为匿名参数:

int func(int num, char*)
{return num + 5;
}

C23引入了constexpr支持,可以定义编译期变量了

constexpr int c = 10/2;

C23将auto关键字的语义进行了修改。auto原本作为Storage class specifier时极少使用,因此auto在C23里变为了自动类型推导关键字。是的,C语言也可以使用auto推导了:

const char* func()
{return "Hello!";
}auto ret = func();

C23增加了对“X位整数”的支持,类型关键字为_BitInt(),编程时可以自由指定整数是几位。类型对应的字面量后缀是wb/WBuwb/UWB例如:

// 12位无符号整数
unsigned _BitInt(12) a = 0uwb;

<uchar.h>中加入类型char8_t,存储UTF-8字符。类型对应的字面量前缀是u8。例如:

char8_t srt[] = u8"你好!";

C23允许给enum(枚举类型)指定类型了,如果不指定类型则默认为int。例如:

enum flags: unsigned long {err1 = 0xCOOOFFFF;err2 = 0xC0010000;
}

C23引入了typeof支持:

int a = 10;
typeof(a) b = 5;

3. 删除

  • <stdlib.h>中的realloc()不再支持size为0的情况,改为未定义行为;
  • C23取消了对三字母词(Trigraph)的支持。三字母词是一种转义字符,由??开头。例如在字面量中使用??)代替]
  • C23规定整数必须使用补码存储,不应再使用原码和反码;
  • C23决定不再支持K&R格式。K&R格式是一种老式C语言写法,例如:
// K&R
int func1(a, b, c)int a;char* b;int c;
{return a + c;
}// 等价于现代语法
int func1(int a, char* b, int c)
{return a + c;
}

Modern C :https://inria.hal.science/hal-02383654
C23 :http://cpp.7fa4.cn/zh/c/23.html

相关文章:

现代C语言:C23标准重大更新

虽然没有固定标准&#xff0c;但一般将C99之后的C语言标准称为“现代C语言”&#xff0c;目前的最新标准为C23。C语言的演化包括标准C89、C90、C99、C11、C17和C23&#xff0c;C23是C语言标准的一次重大修订&#xff0c;截至2024年3月&#xff0c;最新版本的gcc和 clang实现了C…...

Maven进阶——坐标、依赖、仓库

目录 1.pomxml文件 2. 坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 自己项目的坐标 2.5 第三方项目坐标 3. 依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找方法 3.4 依赖范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…...

Android中的内存泄漏及其检测方式

Android中的内存泄漏及其检测方式 一、Android内存泄漏概述 在Android开发中&#xff0c;内存泄漏是一个常见且严重的问题。内存泄漏指的是在应用程序中&#xff0c;由于某些原因&#xff0c;已经不再使用的对象仍然被引用&#xff0c;导致垃圾回收器&#xff08;Garbage Col…...

【雷电模拟器命令合集操作大全】官方文档整理贴

此贴是官方的帮助整理文档在这里插入代码片 一起来看看几个主要命令&#xff0c;大部分命令读者可以自己试试~ 1、launch 支持2种启动雷电模拟器的方式 –name顾名思义&#xff0c;应该是模拟器的标题栏的名字&#xff0c;本人经过验证果然如此! –index mnq_idx&#xff0c;模…...

redis的配置文件解析

我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件&#xff1a; 1.Redis的配置文件名称是&#xff1a;redis.conf 2.在vim这个配置文件的时候&#xff0c;默认是不显示行号的&#xff0c;可以编辑下面这个文件&#xff0c;末尾加上set nu&#xff0c;就会显示行号: 1.…...

Python中的元组和列表

‌Python 列表 Python有6个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表是最常用的Python数据类型&#xff0c;它可以作为一个方括号内的逗号分隔值出现。 列表的数据项不需要具有相同的类型 创建一个列表&#xff0c;只要把逗号分隔的不同的数据项使用方括号…...

【AI战略思考7】粮草筹集完毕和我的朋友分类

注明&#xff1a;这是我昨晚12点多发布在朋友圈的&#xff0c;更新加工后的版本 粮草筹集完毕 统计完成 昨晚从7点半到晚上11点&#xff0c;借款的意向统计完成了&#xff0c;刚好凑够6个月&#x1f604;&#xff0c;我觉得应该够了&#xff0c;我乐观估计是3个月内找到工作&…...

科大讯飞AI开发者大赛颁奖典礼,万码优才荣获前三甲!

在近日揭晓的科大讯飞AI开发者大赛中&#xff0c;万码优才APP凭借其卓越的技术实力、创新的应用方案以及深厚的行业洞察力&#xff0c;在上百个参赛队伍中脱颖而出&#xff0c;在AI Agent助力行业应用升级赛道荣获三甲排名&#xff01;再次证明了其在人工智能领域的领先地位与无…...

Redis 哨兵机制

哨兵机制 哨兵机制的介绍 哨兵 (Sentinel) 先来看一下Redis Sentinel 相关名词解释&#xff1a; 在之前的主从复制中&#xff0c;存在一个问题&#xff0c;那就是当主节点挂了后&#xff0c;通过人工干预的方式来解决是比较繁琐且不那么靠谱的。 在实际开发中&#xff0c;对…...

linux-磁盘io情况、性能排查

命令安装 iostat属于sysstat软件包。可以直接安装。 yum install sysstat操作命令解析 iostat %user&#xff1a;CPU处在用户模式下的时间百分比。%nice&#xff1a;CPU处在带NICE值的用户模式下的时间百分比。%system&#xff1a;CPU处在系统模式下的时间百分比。%iowait&a…...

NC 单据模板自定义项 设置参照,比如部门参照、自定义参照等

NC 单据模板自定义项 设置参照&#xff08;自定义参照&#xff09; 一、如图下图&#xff0c;NC 单据模板自定义项 设置自定义参照&#xff1a; 1、选择需要设置参照的自定义字段&#xff0c;选择高级属性页签&#xff0c;在类型设置中&#xff0c;数据类型选择参照信息&#…...

table-cascade 使用

stable-cascade 使用教程 English 中文 1.安装最新版本的 Comyfui 2.将 https://huggingface.co/stabilityai/stable-cascade/tree/main 下面的 stage_b 和 stage_c 模型放到 ComfyUI/models/unet 下面 3.将 https://huggingface.co/stabilityai/stable-cascade/tree/main …...

Android SELinux——策略文件配置结构(八)

在 Android 系统中,SELinux 主要是通过一系列配置文件来进行管理和配置的。这些配置文件涵盖了策略定义、标签映射、签名信息等多个方面。 一、SeLinux文件体系 之前提到 Android 架构中大致包含 AOSP、厂商、Vendor 等部分。在 Android 8 以上的系统中,AOSP 和厂商、供应商…...

【数据结构与算法】队列——数据世界中的“有序使者”

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 引言 一.队列的基本概念 1.1 队列的定义 1.2 队列的特性 1.3 队列的基本操作 二.队列的实现方式 2.1 基于链表的队列 2.2 基于数组的队列 三.基于链表的队列实现 定义链表队列的结构 初始化 入队列——向队列中插…...

yolov11 部署 TensorRT,预处理和后处理用 C++ cuda 加速,速度快到飞起

之前搞过不少部署&#xff0c;也玩过tensorRT部署模型&#xff08;但都是模型推理用gpu&#xff0c;后处理还是用cpu进行&#xff09;&#xff0c;有网友问能出一篇tensorRT用gpu对模型后处理进行加速的。由于之前用的都是非cuda支持的边缘芯片&#xff0c;没有写过cuda代码&am…...

国际期货收费行情源CTP推送式/期货配资软件开发对接行情源的技术性说明

在现代金融市场中&#xff0c;期货交易因其高风险和高回报特性而备受关注。为了满足期货交易者的需求&#xff0c;开发高效、稳定和安全的期货交易软件变得尤为重要。本文将对国际期货收费行情源CTP推送式及期货配资软件的开发对接行情源的技术细节进行详细说明。 一、CTP&…...

上拉电阻和下拉电阻在电路中的作用(一)

上拉电阻和下拉电阻在电路中的作用&#xff08;一&#xff09; 1.什么是上下拉电阻2.上下拉电阻的作用&#xff1a;2.1.维持输入引脚处于稳定状态。2.2.配合三极管和MOS进行电平转换电路设计2.3.OC、OD电路&#xff08;Open Collector集电极开路、Open Drain漏电极开路&#xf…...

怎么轻松把图片存入二维码?图片生成二维码的简单3步技巧

进入数字化时代&#xff0c;图片是目前应用广泛的一种信息传递方式&#xff0c;可以通过看图来获取需要的内容&#xff0c;那么图片如何更快捷的在更多人之间传递呢&#xff1f;通过将图片生成二维码后分享&#xff0c;可以实现图片的快速传递&#xff0c;制作成本也比较低&…...

perl双引号内字符串的反斜线转义

perl双引号内字符串的反斜线转义 如题&#xff0c;下面表格列举了perl双引号内字符串的反斜线转义&#xff1a; 组合意义\n换行\r回车\t水平制表符\f换页符\b退格\a系统响铃\eEsc&#xff08;ASCII编码的转义字符&#xff09;\007八进制表示的ASCII值&#xff08;此例中007表…...

【编程语言】Kotlin快速入门 - 伴生对象与懒加载

静态与顶层方法 静态方法&#xff08;伴生对象&#xff09; Java中有静态方法的概念&#xff0c;但是在Kotlin中这个静态方法被弱化了&#xff0c;还记得我们使用object创建一个单例类吗&#xff0c;创建的单例类我们当时可以使用像静态方法一样的调用方式取调用&#xff0c;…...

OpenClaw 超级 AI 实战专栏【补充内容】AI开发实操:减少Token用量、提升模型效率的8个核心技巧(附代码)

目录 一、核心前提:理解Token消耗的关键场景 二、6种优化方案(附案例+代码) 方案1:精简Prompt(最易落地,立竿见影) 核心思路 应用案例 代码实现 方案2:上下文窗口裁剪(避免历史信息冗余) 核心思路 应用案例 代码实现 方案3:输入文本摘要压缩(批量处理场景…...

如何用PPTist快速创建专业演示文稿:免费在线PPT制作完全指南

如何用PPTist快速创建专业演示文稿&#xff1a;免费在线PPT制作完全指南 【免费下载链接】PPTist 基于 Vue3.x TypeScript 的在线演示文稿&#xff08;幻灯片&#xff09;应用&#xff0c;还原了大部分 Office PowerPoint 常用功能&#xff0c;实现在线PPT的编辑、演示。支持导…...

【Hot 100 刷题计划】 LeetCode 138. 随机链表的复制 | C++ 链表深拷贝题解

LeetCode 138. 随机链表的复制 | C 哈希表 DFS 深拷贝题解 &#x1f4cc; 题目描述 题目级别&#xff1a;中等 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 请你构造这个链表的深拷…...

洛谷 P1833:樱花 ← 混合背包(01 + 完全 + 多重)

【题目来源】 https://www.luogu.com.cn/problem/P1833 【题目描述】 爱与愁大神后院里种了 n 棵樱花树&#xff0c;每棵都有美学值 Ci(0<Ci≤200)。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸&#xff0c;他懂得如何欣赏樱花&#xff1a;一种樱花树看一遍…...

注册表CLSID权限控制技术:通过权限管理实现IDM永久试用

注册表CLSID权限控制技术&#xff1a;通过权限管理实现IDM永久试用 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 问题引入&#xff1a;IDM试用期管理的技术困境…...

给嵌入式新手的Cortex-M0内核超详细图解:从寄存器到中断,一篇搞定STM32/GD32入门

给嵌入式新手的Cortex-M0内核超详细图解&#xff1a;从寄存器到中断&#xff0c;一篇搞定STM32/GD32入门 刚拿到STM32开发板时&#xff0c;看着密密麻麻的引脚和上百页的芯片手册&#xff0c;我完全不知道从哪里开始。直到导师指着原理图说&#xff1a;"把芯片想象成一个忙…...

EVA-01场景应用:电商商品分析、文档信息提取,真实工作流分享

EVA-01场景应用&#xff1a;电商商品分析、文档信息提取&#xff0c;真实工作流分享 1. 从科幻到现实&#xff1a;EVA-01的商业价值 在电商运营和文档处理的日常工作中&#xff0c;我们常常面临这样的挑战&#xff1a;海量商品图片需要人工标注关键信息&#xff0c;繁杂的合同…...

8255A工作方式0实战:手把手教你用汇编语言驱动八路抢答器LED与数码管

8255A工作方式0实战&#xff1a;从零构建八路抢答器驱动框架 记得第一次在实验室见到8255A芯片时&#xff0c;那块黑色的DIP封装器件看起来平平无奇&#xff0c;直到它让八颗LED随着我的汇编指令跳起"灯光芭蕾"。本文将带你深入这个经典可编程并行接口芯片的实战应用…...

既然有 HTTP 协议,为什么还要有 RPC?

HTTP 和 RPC 都能解决网络通信问题&#xff0c;但它们的设计初衷和适用场景截然不同。简单来说&#xff0c;HTTP 是为了通用性和跨平台设计的&#xff08;像万能的集装箱&#xff09;&#xff0c;而 RPC 是为了极致的性能和开发效率设计的&#xff08;像工厂内部的高速流水线&a…...

如何为Obsidian插件添加多语言支持:终极国际化指南

如何为Obsidian插件添加多语言支持&#xff1a;终极国际化指南 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 如果你正在寻找一款能够帮助你的Obsidian插件突破语言限制的工具&#xff0c;那么Obsidian-i18n正是你需要的…...