命名循环习语:危险?

2024-04-20

我读过一篇关于 C++ 中的“命名循环惯用法”的文章:http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Loop http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Loop

这个习语允许我们写这样的东西:

named(outer) 
for(int i = 0 ; i < rows ; ++i) {

   named(inner) 
   for(int j = 0 ; j < cols ; ++j) {

        if(some_condition)
            break(outer);   // exit the 'outer' loop 

   }
}

这种结构已经作为许多语言的核心特性存在,例如 Java。

根据文章,它可以通过定义两个邪恶的宏在 C++ 中实现:

#define named(blockname) goto blockname; \
                         blockname##_skip: if (0) \
                         blockname:

#define break(blockname) goto blockname##_skip;

我知道很多人想禁止使用goto。我个人发现它在极少数情况下很有帮助,特别是当我想要break一堆嵌套循环。在我看来,这个习惯用法是一个更干净的解决方案,但是在实际代码中使用它可以吗?

在文章的讨论页面上,可以看到:

“不要这样做。你最终会下地狱”

所以我的问题是:使用命名循环习惯用法有哪些缺点?危险吗 ?如果是,为什么?

额外问题:是否可以实现命名continue相似地 ? (我认为不可能使用named(...) for(...;...;...) {}语法,但谁知道呢?)

编辑:我同意你的观点,重新定义关键字是令人讨厌的。使用怎么样#define breakLoop()反而?


正如评论中所述,#definingbreak是有问题的。假设您使用其他东西。

我仍然认为这很危险。这是一个极其不寻常的习惯用法(对于 C++ 程序员来说),因此他们不太可能理解,因此他们可能会做出重大更改。鉴于有一些不那么令人惊讶,因此也不那么危险的方法来完成同样的事情,我建议不要这样做。

考虑将循环放入函数或 lambda 中。然后你可以return打破外循环。好处是,您可以返回有关过早退出的信息,这可能对外部代码有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

命名循环习语:危险? 的相关文章

随机推荐

  • 2 个不同类中使用的拥有类型的 EF Core 配置问题

    我正在使用实体框架核心 我想在 2 个不同的类中使用相同的拥有类型 这通常很好 但就我而言 我遇到了错误 我正在使用 MySql 数据库 要求所有布尔值都映射到数据库中列类型为tinyint 1 的字段 为了在我的 OnModelCreat
  • Android InstantiationException With Fragment(它是公共的)

    我有一个Fragment 它不是内部类 并且没有任何构造函数 public class PreferenceListFragment extends ListFragment implements OnClickListener 我在 An
  • 如何将 JSON 映射到 C# 对象

    我在理解如何实现这一点方面遇到了问题 基本上我们有一个 API 用户发送以下格式的 JSON Profile Name Joe Last Doe Client ClientId 1 Product Apple Message Peter l
  • 由于触发器执行,登录“用户”登录失败

    我在部署的 ASP NET Web 应用程序上随机收到此错误 我没有在数据库中使用任何触发器 所以我不知道该怎么做 这是在周末没有人参与申请时出现的 它只是随机发生的 请帮助这是关键任务 这是我收到错误的第一个实例 public stati
  • 如何从 C# 中的本机 dll 捕获 c0000005 异常

    我正在使用一个本机 dll 该 dll 在某处抛出 c0000005 异常 访问冲突 并最终导致我的 Web 服务崩溃 直到该服务被回收 有没有办法捕获异常 我同意其他人的观点 解决问题 但有时您继承代码 而您只想捕获生产中的意外违规 在
  • 有什么办法可以提高 BitmapFactory.decodeStream() 的速度?

    显然这是一项昂贵 耗时的操作 有什么办法可以改善这个情况吗 Bitmap bm BitmapFactory decodeStream InputStream new URL someUrl getContent 我猜想确实没有办法避免这种相
  • 配置具有超过 16 个项目的 UITabBar

    My UITabBarController包含超过 16 个视图控制器 当我进入 更多 选项卡时 我可以看到所有UITabBarItems 如果我单击 编辑 按钮 我可以看到前 16 个图标 但没有足够的空间来显示更多图标 因此从第 17
  • 从 C# 打印标签 - 文档尺寸对于打印机来说太大

    我正在开发一个必须打印标签的应用程序 我使用的标签打印机是 Brother QL 570 标签宽度为66mm 标签长度需要约为45mm 我遇到的问题是我无法配置应用程序来实际打印标签 每次这样做时 我都会收到一条警告 指出文档尺寸对于打印机
  • 无法在表视图中使用自动布局约束

    我有这个表视图 无法添加任何自动布局约束 控件拖动不起作用 没有显示任何约束 并且构建器表单似乎处于非活动状态 我无法在其中设置任何值 见下文 自动布局在整个项目的任何地方都启用 基本上在每个视图上 这是为什么 这是因为您选择了单元格或单元
  • WARN 获取相关 ID 为 1 的元数据时出错:{MY_TOPIC?=INVALID_TOPIC_EXCEPTION} (org.apache.kafka.clients.NetworkClient)

    当我使用 kafka 运行以下命令时0 9 0 1 我收到这些警告 1 你能告诉我我的主题有什么问题吗 我正在与在 ec2 中运行的 kafka 经纪人交谈 kafka console consumer sh new consumer bo
  • iOS FFT Accerelate.framework 在播放期间绘制频谱

    更新2016 03 15 请看一下这个项目 https github com ooper shlab aurioTouch2 0 Swift https github com ooper shlab aurioTouch2 0 Swift
  • java中如何让SSL服务器socket同时支持http和https?

    我正在尝试使用 java 套接字创建简单的 Web 服务器 它应该支持 http 和 https 但我一次只能实现一个 我需要同时支持 http port 80 和 https port 443 的逻辑 这是使用 sslsocket 的 H
  • “错误LNK2001:无法解析的外部符号”[重复]

    这个问题在这里已经有答案了 我的 VC 2008 程序有问题 当我编译它时 会列出以下错误 我花了很多钱 去groups google com找了一下原因 但是没有评论 帮助过我 有人知道问题是什么吗 谢谢 error LNK2001 un
  • 如何使用 Jackson 解析 JSON 数组响应?

    我正在为 Android 构建一个 RESTful 客户端 我有一个关于 Jackson 的问题 我收到以下 JSON 响应 cars active true carName categoryId licenseType licenseTy
  • 从 OFFSET / FETCH NEXT 获取总行数

    因此 我有一个函数可以返回一些我想在我的网站上实现分页的记录 有人建议我使用 SQL Server 2012 中的 Offset Fetch Next 来完成此操作 在我们的网站上 我们有一个区域列出了记录总数以及您当时所在的页面 之前 我
  • 将命名 URL 的值分配给 Django 模板中的变量

    在我的 Django 模板中 我需要将名称 url 的值分配给 with 块中的变量 以便我可以在多个地方使用它 我需要实现这样的目标 for tag in post tags all with tagabs url showtag tag
  • 检查 JObject 中的空或 null JToken

    我有以下 JArray clients JArray clientsParsed objects foreach JObject item in clients Children etc SQL params stuff command P
  • 在 Android 的 Talkback 辅助功能中将缩写或缩写发音为单个字符

    我正在使用对讲来开发语音辅助功能 但是当画外音从文本视图中读取文本时 它将缩写 首字母缩写作为单词而不是单个字符读取 例如 FBI 应该是 F B I 而不是作为单词读出 不要试图强迫屏幕阅读器以某种方式阅读单词或缩写 这可能会扰乱盲文用户
  • 我真的应该将餐桌预订时间保存为 UTC 吗?

    这可能是一个愚蠢的问题 我提前道歉 但考虑到业务背景 我是否真的需要在数据库中以 utc 格式保存餐桌预订时间 并担心将其转换为网络客户端上的本地时间 预订将始终针对特定位置 地理 城市 进行 因此无论当前与 UTC 的时间偏移是什么 夏令
  • 命名循环习语:危险?

    我读过一篇关于 C 中的 命名循环惯用法 的文章 http en wikibooks org wiki More C 2B 2B Idioms Named Loop http en wikibooks org wiki More C 2B