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

C++使用do {} while(false)的好处

缘由

2005年的时候,看到国外开源大牛不少函数里面是用do {} while(false)循环。我按照这样的方法调整后,if else的层级大大缩小,而且函数只有一个出口,大大便于我排查问题。 这样的循环看似没有意义,主要用于结构化代码、简化控制流和避免 goto

🔍 主要用途

1️⃣让代码块支持 break,避免 goto

通常在复杂逻辑处理中,如果要在中途提前退出,常见的方法是 goto 或 return,但 do-while(false) 可以提供更优雅的解决方案:

void test() {
    do {
        if (!init()) {
            std::cerr << "Initialization failed!" << std::endl;
            break;  // 直接退出整个代码块
        }
        
        if (!loadData()) {
            std::cerr << "Data loading failed!" << std::endl;
            break;  // 直接退出整个代码块
        }

        processData();  // 只有前面都成功才会执行
    } while (false);
}

📌 好处

​ • 允许使用 break 直接跳出代码块,避免 goto,提高可读性。

​ • 比 return 更灵活,因为 return 会直接退出 test() 函数,而 break 只是退出当前代码块。


2️⃣ 代码结构清晰,可读性更好

在代码审查时,这种 do-while(false) 结构能明确表达:这段代码本质上是一个单次执行的块,但可能在某些情况下提前退出

🔹 示例:没有 do-while(false) 的写法

void test() {
    if (!init()) {
        std::cerr << "Initialization failed!" << std::endl;
        return;
    }

    if (!loadData()) {
        std::cerr << "Data loading failed!" << std::endl;
        return;
    }

    processData();
}

🔹 使用 do-while(false) 后

void test() {
    do {
        if (!init()) {
            std::cerr << "Initialization failed!" << std::endl;
            break;
        }

        if (!loadData()) {
            std::cerr << "Data loading failed!" << std::endl;
            break;
        }

        processData();
    } while (false);
}

优势

​ • 代码结构更加明显清晰,整个流程被包裹在 do 块里,所有可能提前退出的地方用 break 处理,而非 return。

​ • 未来如果 test() 需要返回特定的错误代码,可以在 do 块外统一返回,而不需要修改多个 return 语句。


3️⃣ 宏定义中的 do-while(false)

在 C 语言和 C++ 的宏定义中,do-while(false) 经常被用来保证宏可以安全地作为单个语句使用

#define SAFE_EXECUTE(code)  do { \
    if (some_condition) { \
        code; \
    } \
} while (false)

这样,如果宏被用于 if 语句,不会影响代码结构

if (flag)
    SAFE_EXECUTE(doSomething());  // 这不会出错,因为 SAFE_EXECUTE 是一个完整的语句
else
    doSomethingElse();

如果不使用 do-while(false),可能会导致语法错误或意外行为。


🚀 结论

✅ do { … } while (false); 本质上不是循环,而是让代码块具有 break 退出能力

主要作用

​ 1. 代替 goto,实现提前退出,让代码更易读。

​ 2. 保持代码块的结构清晰,避免多重 return。

​ 3. 在宏定义中保证安全性,避免 if-else 结构错误。

在某些场景下,它可以让代码更优雅,但如果滥用,也可能让人困惑,所以需要结合具体代码风格和团队规范使用!✨

相关文章:

  • 机器学习模型类型
  • OpenCV 图形API(2)为什么需要图形API?
  • 关于《数据资源建设费用测算标准》(工作组讨论稿)意见征集的通知
  • 白盒测试用例的设计
  • 【学Rust写CAD】16 0、1、-1代数单位元(algebraic_units.rs)
  • Redis:概念与常用命令
  • mysql-分区和性能
  • Java项目生成接口文档的方案
  • Linux环境上传本地文件安装mysql
  • MySQL(数据表创建)
  • 【持续集成和持续部署】
  • H5DS编辑器教程——H5页面触发动画实战指南
  • 视频网站服务器网络连接不稳定该如何解决?
  • Python大数据处理 基本的编程方法
  • 《Oracle服务进程精准管控指南:23c/11g双版本内存优化实战》 ——附自动化脚本开发全攻略
  • Linux C语言获取elf文件符号信息
  • NVIDIA cuOpt:GPU加速优化AI微服务详解
  • 红宝书第十八讲:详解JavaScript的async/await与错误处理
  • 浅谈数据结构
  • 蓝桥杯 数三角
  • 轿车追尾半挂车致3死1伤,事故调查报告:司机过分依赖巡航系统
  • 驱逐行动再加码?特朗普或向利比亚和卢旺达遣送非法移民
  • A股三大股指收涨:军工股掀涨停潮,两市成交近1.5万亿元
  • 印媒证实:至少3架印军战机7日在印控克什米尔地区坠毁
  • 中方对原产印度进口氯氰菊酯实施反倾销措施,商务部回应
  • 中年人多活动有助预防阿尔茨海默病