- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我读过一篇关于 C++ 中“命名循环习语”的文章: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
一堆嵌套循环时。这个成语在我看来是一个更干净的解决方案,但可以在实际代码中使用它吗?
在文章的讨论页面,可以阅读:
"Do not do this. You'll end up in hell"
所以我的问题是:使用命名循环习语有什么缺点?危险吗 ?如果是,为什么?
额外问题:是否可以类似地实现命名的 continue
? (我认为使用 named(...) for(...;...;...) {}
语法是不可能的,但谁知道呢?)
编辑:我同意你的观点,重新定义关键字很讨厌。使用 #define breakLoop()
怎么样?
最佳答案
正如评论中所述,#defining break
是有问题的。假设您使用其他东西。
我仍然认为这很危险。这是一个非常不寻常的习语(对 C++ 程序员而言),因此他们不太可能理解,因此他们可能会做出重大更改。鉴于完成同一件事的方式不那么令人惊讶,因此也不那么危险,我建议不要这样做。
考虑将循环放在函数或 lambda 中。然后你可以 return
跳出外循环。作为一个好处,您可以返回有关过早退出的信息,这可能对外部代码有用。
关于c++ - 命名循环成语 : dangerous?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11005822/
假设有两个对象都继承自 thread 父类“utility thread that uses pthreads”。 class Othread1: public thread { public:
MavenCentral 包含很多 Artifact 。其中一些不应该使用,因为它们有严重的错误,例如威胁安全。 我知道 Nexus Firewall 提供了一项昂贵的服务来分析这些 Artifact
我的 IDE (JetBrains IntelliJ IDEA) 警告我要对方法参数进行同步,即使它始终是对象也是如此。 完整警告内容如下: Synchronization on method par
我读过一篇关于 C++ 中“命名循环习语”的文章:http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Loop 这个成语让我们可以这样写: n
这个问题在这里已经有了答案: 关闭12年前. Possible Duplicate: Can I protect against SQL Injection by escaping single-qu
假设我允许用户链接到他们喜欢的任何图像。该链接将被检查语法正确性、转义等,然后插入 中。标签。 是否存在任何已知的安全漏洞,例如由某人链接到“evil.example.com/evil.jpg”,并
有时我的应用程序中会遇到格式错误的异常。异常情况接二连三地出现,如下: Caused by: java.lang.reflect.InvocationTargetException at sun.re
所以已经开始记录我的 F# 之旅,起初它们看起来相当危险。起初这似乎很聪明: type Card = { Name : string; Phone : string;
在编写调试语句时,我总是添加// DANGER注释,我知道在构建下一版Android应用程序之前必须将其删除。 因此,在构建每个发行版之前,我手动执行CTRL + Shift + F搜索"DANGER
为了查看用户在我的网站上链接到的另一个网站的实时预览,我使用了 iframe。 但是,这可能不是最好的解决方案,因为网站直接加载到我的网站中,每个 JavaScript 元素等都在链接页面上。 我的问
我有一个 Web API 项目。我的端点之一允许进行字符串搜索,其中可能包含特殊字符。 [RoutePrefix("api/Search")] [ValidateInput(false)] // th
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: A potentially dangerous Request.Form value was detected fr
在学校的计算机实验室中,我们使用 fputs 编写了一个程序,编译器返回了一个错误 gets is a dangerous function to use 和一个类似的错误 fputs 但是在家里,当
我正在检查一个计算器示例,在该示例中使用了 eval() 这通常是危险的,但这里是该示例的一部分; if button == "=": #Check carefully how we usin
在“Spark:权威指南”一书中(目前处于早期版本,文本可能会更改),作者建议不要将 Pyspark 用于 Spark 中的用户定义函数: “启动这个 Python 进程是昂贵的,但真正的成本是将数据
我正在开发一个将预安装(作为系统应用程序)在固件上的应用程序。 到目前为止关于 system apps 之间关系的文档,新权限模型,and the protection levels - 我不明白系统
考虑这个最小的例子(我能想到的): struct Bar; struct Foo { Bar* const b; Foo(Bar* b) : b(b) {} }; struct Bar {
我的 MVC .NET Core 项目中的一个页面上有一个下拉列表,我想为其自定义默认验证文本。 --Select Product -- 给出的标准验证错误消息是“需要产品 ID 字段”
这是我第一次使用 SafeHandle。 我需要调用这个需要 UIntPtr 的 P/Invoke 方法。 [DllImport("advapi32.dll", CharSet = CharS
我在 C# 项目中使用 Kendo MVC。 我正在尝试将 k-danger 类添加到剑道按钮。我不知道为什么,但它在 k-primary 类工作的地方不起作用。 这是我的按钮代码: // Thi
我是一名优秀的程序员,十分优秀!