(C23/C++23) 语句末尾的标签

文章目录

  • 🔖前言
    • 🏷️ref
    • 🏷️标号
  • 🔖兼容
    • 🏷️23标准前
    • 🏷️23标准后
    • 🏷️原因
  • 🔖未兼容
  • 🔖END
    • 🌟关注我

🔖前言

🏷️ref

  • C++23提案·复合语句末尾的标签
    • p2324r2.pdf (open-std.org)
  • C23提案·声明和语句块结束前的标签
    • n2508.pdf (open-std.org)

在C/C++的标签使用语法中,两们语言的规定并不是一致的。很容易产生写法A在C语言中可行,而C++中不行。(虽然部分编译器做了增强,但标准中就是不行)。

但非常幸运的是两者都在23标准中互相做了兼容。

个人猜测是那帮专家自己写要兼容的代码时觉得非常麻烦而提出的。

因为标签的意义就是一个表示,且表示非常明确,编译器理应本身就能做区分。

🏷️标号

任何语句都能有标号,通过在语句自身前提供一个跟随冒号的名称。

任何语句(但非声明)可以前附任意数量的标号,每个都声明一个 标识符 为标号名,标号名必须在闭合的函数中唯一(换言之,标号名拥有函数作用域)。

标号声明自身没有效果,不会以任何方式变更控制流,或修改跟随其后的语句的行为。

🔖兼容

🏷️23标准前

下面是一个典型的例子。此代码特指两者在23标准前的情况。

demo.c & demo.cpp

/* C23 C++23 标准之前 */
void foo(void) {/* C++ 允许     *//* C   不允许   */
first:int x;/* C++ 允许     *//* C   允许     */
second:x = 1;/* C++ 不允许   *//* C   不允许   */
last:
}

尝试编译测试:

测试环境

当然笔者这里的gcc本身就不支持23标准。

$ gcc --versiongcc (x86_64-posix-seh-rev3, Built by MinGW-W64 project) 11.2.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

C语言

gcc -pedantic -ansi -std=c17 -c demo.c 
demo.c: In function 'foo':
demo.c:6:5: warning: a label can only be part of a statement and a declaration is not a statement [-Wpedantic]6 |     int x;|     ^~~
demo.c:15:1: warning: label at end of compound statement [-Wpedantic]15 | last:| ^~~

C++

g++ -pedantic -ansi -std=c++20 -c demo.cpp
demo.cpp: In function 'void foo()':
demo.cpp:16:1: error: expected primary-expression before '}' token16 | }| ^

🏷️23标准后

没啥可说的,就是上面的情况在 C23/C++23 后都允许。

🏷️原因

摘自P2324R2

In C declarations and statements are separate production rules which can both appear as block-items inside compound statements.
The simplest change for C was to also allow labels as independent block-items in addition to statements and declarations.
This change then also allowed placing labels at the end of a compound statement which was seen as useful feature.


在C语言中,声明和语句是独立的生成规则,它们都可以作为复合语句中的块项出现。

对于C来说,最简单的改变是除了语句和声明之外,还允许标签作为独立的块项。

这个变化还允许在复合语句的末尾放置标签,这被认为是一个有用的特性。

In C++ declarations are statements and compound statements can only have statements as block-items.
Thus, labels can already be attached to all statements, i.e. including declarations, but can not be placed at the end of compound statements.
Another difference is that in C++ (but not in C) it is possible to use declarations as sub-statements of a control statements.
The later seems to be an unintended side effect of making declarations be statements and now requires a rewrite rule to place this declaration into a new scope.


在c++中,声明是语句,复合语句只能有语句作为块项。

因此,标签可以附加到所有语句,即包括声明,但不能放在复合语句的末尾。

另一个区别是,在c++(而不是C)中,可以将声明用作控制语句的子语句。

后者似乎是使声明成为语句的意外副作用,现在需要重写规则将该声明放入新的作用域。

🔖未兼容

来看另一个例子。

该例子在C++中式可行的,但在C语言中,即使到了C23还是不可行。

因此对于该情况,还是要添加大括号构成块级作用域规范些。

void bar(void) {/*** C++ 可行* C   不可行 (C23 仍不可行)*/if (1)
here:int x;
}

🔖END

上文代码的在线示例:https://godbolt.org/z/6MEdTheG9

🌟关注我

关注我,学习更多C/C++,算法,计算机知识

B站:

👨‍💻主页:天赐细莲 bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/393737.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Serverless 1

一、云原生应用 云原生应用覆盖到: 大数据,人工智能,边缘计算,区块链等 服务代理:envoy API 网关:APISIX 服务网格:Istio 服务发现:CoreDNS 消息和流式处理:kafka Serve…

PDF预览:利用vue3-pdf-app实现前端PDF在线展示

目录 PDF预览:利用vue3-pdf-app实现前端PDF在线展示 一、vue3-pdf-app组件介绍及其优点 1、vue3-pdf-app是什么 2、作用与场景 3、类似的插件 二、项目初始化与依赖安装 1、初始化Vue3项目 2、安装依赖 三、集成vue3-pdf-app插件 1、引入插件 2、配置组件…

ChemLLM化学大模型再升级,AI助力化学研究

ChemLLM 介绍 ChemLLM 系列模型 是由上海人工智能实验室基于InternLM2 开发的首个兼备化学专业能力和对话、推理等通用能力的开源大模型。相比于现有的其他大模型,ChemLLM 对化学空间进行了有效建模,在分子、反应和其他领域相关的化学任务上表现优异。 …

解决戴尔台式电脑休眠后无法唤醒问题

近期发现有少量戴尔的台式机会有休眠后无法唤醒的问题,具体现象就是电脑在休眠后,电源指示灯以呼吸的频率闪烁,无论怎么点鼠标和键盘都没有反应,并且按开机按钮也没法唤醒,只能是长按开机键强制关机再重启才行&#xf…

leetcode 958.二叉树的完全性检验

1.题目要求: 给你一棵二叉树的根节点 root ,请你判断这棵树是否是一棵 完全二叉树 。在一棵 完全二叉树 中,除了最后一层外,所有层都被完全填满,并且最后一层中的所有节点都尽可能靠左。最后一层(第 h 层)…

YOLOv8改进 | 主干网络 | 将backbone替换为MobileNetV4【小白必备教程+附完整代码】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…

Linux PCI和PCIe总线

1 PCIe中断 - PCI/PCIe设备中断都是level触发,并且请求信号为低电平有效 - PCI总线一般只有INTA#到INTD#的4个中断引脚,所以PCI多功能设备的func一般不会超过4个,但是共享中断除外 2 IOMMU 2.1 ARM SMMU v2 Refer to my blog ARM SMMU v2. 2.…

【机器学习】重塑游戏世界:机器学习如何赋能游戏创新与体验升级

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 🔍1. 引言:游戏世界的变革前夜📒2. 机器学习驱动的游戏创新🌞智能化游戏设计与开发&…

OJ-0807

题目 参考 import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);String input in.nextLine();String[] numStrs inp…

身体出现这5种异常,可能是甲状腺在求救,千万别扛着!

甲状腺,被誉为人体新陈代谢的“发动机”,是调节我们身体能量和代谢的重要器官。然而,当甲状腺出现问题时,它往往会通过身体的一些异常信号向我们求救。北京精诚博爱医院张维一主任提醒:以下是五种常见的甲状腺异常表现…

您知道Jmeter中Redirect Automatically 和 Follow Redirects的使用场景吗?

相信很多使用过jmeter的同学都没有关注过请求中的Redirect Automatically 和 Follow Redirects选项,如下图: 在 JMeter 中,Redirect Automatically 和 Follow Redirects 是与 HTTP 请求重定向相关的两个选项,它们之间是有很大区别…

速度规划之:起点速度和终点速度不为零的非对称梯形速度规划

起点速度和终点速度不为零的非对称梯形速度规划 一、引言二、理论基础1. 梯形速度规划概述2.数学建模- 变量定义- 约束关系- 公式推导 三、计算过程1.只存在减速段2.只存在加速段3.存在加速段和减速段4.存在加速度段、匀速段和减速段 四、仿真实现五、优缺点优点缺点 六、总结 …

亚马逊等跨境电商平台怎么找到好的测评资源?

如何找到好的测评资源呢? 目前常规卖家找测评资源主要通过以下途径: 联系自己在海外的亲友帮忙测评,不过海外的亲友会比较有限安排业务员在facebook等社交平台找老外测评,但社交平台找老外很难掌控留评时效,甚至会遇…

破解USB设备通讯协议实现自定义软件控制的步骤与方法

在设备和计算机之间通过USB进行通讯的情况下,厂家提供的软件可以控制设备,但没有提供任何其他资料和支持,这种情况下,若希望自行开发软件来实现同样的功能,可以通过以下步骤破解通讯协议并开发自定义程序。 1. 捕获US…

2-57 基于matlab 实现了气缸的充气和放气的仿真

基于matlab 实现了气缸的充气和放气的仿真,在等温情况和绝热两种情况下分别进行了仿真,并给多变过程下的理论计算公式。程序已调通,可直接运行。 2-57 matlab 气缸充气和放气仿真 - 小红书 (xiaohongshu.com)

【论文阅读】PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

Q: 论文如何解决这个问题? A: 论文通过提出PETRv2框架来解决多相机图像的3D感知问题,具体方法包括以下几个关键点: 时间建模(Temporal Modeling): 通过3D坐标对齐(3D Coordinates Alignment&…

ASP.Net Core设置接口根路径的方法

使用asp.net core开发微服务项目,需要给每个服务设置不同的根路径,这样既能使用网关转发请求,又方便对单个服务进行测试,保证请求路径的统一。 设置方法需要使用中间件,在Program.cs添加如下代码 app.UsePathBase(&qu…

通过ZRender画一个大屏的顶部样式标题

介绍:通过ZRender画一个大屏项目的顶部样式,在其中放入大屏的标题。ZRender 是二维绘图引擎,它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器。 一、下载 npm install zrender终端输入以上命令下载包即可。 二、导…

记忆化搜索——1

目录 1.斐波那契数 2.不同路径 3.最长递增子序列 4.猜数字大小2 5.矩阵中的最长递增路径 1.斐波那契数 该题规律很明显,就直接放记忆化搜索的版本了 class Solution { public:int dfs(int n){if(n0||n1)//递归出口{return n;}if(f[n-1]-1)//检查是否已经记忆过…

JVM 加载阶段 Class对象加载位置是在 堆中还是方法区?

在JVM(Java虚拟机)的类加载过程中,Class对象的加载位置涉及到堆(Heap)和方法区(Method Area)两个关键区域。具体来说,类的加载阶段涉及到将类的.class文件中的二进制数据读入到内存中…