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

news2024/9/29 21:29:59

文章目录

  • 🔖前言
    • 🏷️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 --version

gcc (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 '}' token
   16 | }
      | ^

🏷️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.coloradmin.cn/o/1980227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 两数之和绝对值最小(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题…

基于机器学习和深度学习的时间序列分析和预测(Python)

时间序列数据与其它数据不同主要是因为时间序列数据在时间维度上存在依赖关系,这说明在时间序列数据当中过去的历史数据当中隐藏着一些时间序列数据固有的特性,例如,周期性、趋势性、不规则性等。时间序列预测便是通过不同的方法来捕捉这种规…

【抽象工厂模式】从理论到实战:构建可扩展的软件家族(设计模式系列)

文章目录 Java设计模式系列:抽象工厂模式详解1. 引言抽象工厂模式概述为何选择抽象工厂模式 2. 基础知识回顾Java基础概念复习面向对象编程原则设计模式的原则和目的 3. 抽象工厂模式的定义定义与解释模式的目的与其他工厂模式的区别 4. 抽象工厂模式的结构抽象产品…

【Android】数据持久化——数据存储

持久化技术简介 在你打开完成了一份PPT之后关闭程序,再次打开肯定是希望之前的内容还存在在电脑上,一打开PPT,之前的内容就自动出现了。数据持久化就是将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下…

React 学习——别名路径配置(可以使用@代表src),引用文件时使用;联想路径提示

一.别名路径配置 1、安装craco (npm i -D craco/craco);安装成功的截图如下: 2、在项目的根目录下创建一个 名为 craco.config.js 文件;(必须是根目录下,名称必须和我这个一样)&…

C语言调试宏全面总结(六大板块)

C语言调试宏进阶篇:实用指南与案例解析C语言调试宏高级技巧与最佳实践C语言调试宏的深度探索与性能考量C语言调试宏在嵌入式系统中的应用与挑战C语言调试宏在多线程环境中的应用与策略C语言调试宏在并发编程中的高级应用 C语言调试宏进阶篇:实用指南与案…

嵌入式人工智能(44-基于树莓派4B的扩展板-LED按键数码管TM1638)

树莓派性能非常强悍,但是对于某些复杂的项目来说,会出现心有余而口不足的情况,为了解决这类问题,可以在树莓派上使用扩展板,我们介绍几款常见的扩展板,不仅可以扩展到树莓派,其他单片机或嵌入式…

Vue3 列表自动滚动播放(表头固定、列表内容自动滚动播放)+ vue3-seamless-scroll - 附完整示例

vue3-seamless-scroll:Vue3.0 无缝滚动组件,支持Vite2.0,支持服务端打包 目前组件支持上下左右无缝滚动,单步滚动,并且支持复杂图标的无缝滚动,目前组件支持平台与Vue3.0支持平台一致。 目录 效果 一、介绍…

安装vscode -- linux

前言 相信很多人在刚开始使用linux时,不知道怎么安装vscode来辅助我们编程,那么我将在此记录我所用的安装vscode的方法。 安装方法 方法一:snap 第一步:检查软件更新状况 sudo apt update在终端输入上述命令,会提…

大模型学习笔记 - LLM 之RLHF人类对齐的简单总结

LLM - RLHF人类对齐的简单总结 LLM-人类对齐 1. RLHF(Reinforcement Learning from Human Feedback, RLHF),基于人类反馈的强化学习2 奖励模型训练3 强化学习训练 3.1 PPO介绍3.2 进阶的RLHF的介绍 3.2.1. 过程监督奖励模型3.2.2. 基于AI反馈的强化学习3.2.3. 非强化学习的对齐…

卷积神经网络 - 基本卷积函数的变体篇

序言 在深度学习和卷积神经网络( CNN \text{CNN} CNN)的广阔领域中,基本卷积函数是构建网络结构的基础,它们通过滑动窗口的方式对输入数据进行特征提取。然而,随着应用场景和数据复杂性的增加,单一的卷积方…

苹果Vision Pro生态发展:现状、挑战与未来展望

苹果公司以其创新技术和强大的生态系统闻名于世。在最近的财报会议上,CEO蒂姆库克分享了Vision Pro平台的最新进展,引发了业界的广泛关注。本文将深入探讨Vision Pro生态的现状、面临的挑战以及与其他XR平台的对比分析。 一、Vision Pro生态现状 据库克介绍,Vision Pro平台…

爬1688商品---(测试版)

半成品. from DrissionPage import ChromiumPage import time from selenium import webdriver urlhttps://p4psearch.1688.com/hamlet.html?scene6&cositebaidujj_pz&locationre&trackid885662561117990122602pageChromiumPage()page.get(url)def key_wof():inde…

C++ QT开发 学习笔记(3)

C QT开发 学习笔记(3) - WPS项目 标准对话框 对话框类说明静态函数函数说明QFileDialog文件对话框getOpenFileName()选择打开一个文件getOpenFileNames()选择打开多个文件getSaveFileName()选择保存一个文件getExistingDirectory()选择一个己有的目录getOpenFileUrl()选择打幵…

荒原之梦考研:考研二战会很难吗?

考研二战是不是很难,其实很大程度上取决于我们自己,我们能否认清自己的优势,能否指定和执行合理的计划,有没有强大的心理支撑等,都是决定考研二战能否成功,或者能否比较轻松的成功的关键。 在本文中&#…

HCIP重修总笔记(中)

第八节 BGP基础 一、BGP产生背景 BGPBorder Gateway Protocol,边界网关协议)是一种用于自治系统间的动态路出协议,是一种外部网关协议。 自治系统AS:一组同一个管理机构进行管理,对外呈现统一选路策略的路由器的集合。 自治系统编号: …

浅谈基础的图算法——强联通分量算法(c++)

文章目录 强联通分量SCC概念例子有向图的DFS树代码例题讲解[POI2008] BLO-Blockade题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 思路AC代码 【模板】割点(割顶)题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示…

数据结构实验报告-顺序表

桂 林 理 工 大 学 实 验 报 告 一、实验名称 实验1 顺序表 二、实验内容: 1.将书中介绍的顺序表的基本算法(如初始化、求长度、插人、删除、输出等)汇总在一起,用一个完整的程序实现顺序表的基本运算,并且编写顺序表的判空、判满等基…

最常见的AI大模型总结

前言:大模型可以根据其主要的应领域和功能,可以分类为“文生文”(Text-to-Text)、“文生图”(Text-to-Image)和“文生视频”(Text-to-Video),都是基于自然语言处理&#…

JVM从入门到放弃

前言:关于JVM,其实有很多大厂开发了不同版本的JVM,比较知名的有:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、 Azul VM、 Apache Harmony、 Google Dalvik VM、 Microsoft JVM等等。现在使用的比较多的JDK8版本就是Sun HotSpot V…