代码分块

此时和{}作用是一样的,实现复杂功能时,块内定义变量们可以起到避免命名冲突以及缩短作用域的功能。

辅助定义复杂宏

  1. 复杂宏展开错误 ```cpp

    define MY_MACRO MyFunctionA(); MyFunctionB();

void MyFunctionA() { printf(“exec MyFunctionA\n”); }

void MyFunctionB() { printf(“exec MyFunctionB\n”); }

if (false) MY_MACRO; // 展开

if (false) MyFunctionA(); MyFunctionB();

  1. 2. 多加分号`;`错误
  2. ```cpp
  3. #define MY_MACRO {MyFunctionA(); MyFunctionB();}
  4. // 调用时加上分号编译报错
  5. if (false)
  6. MY_MACRO; // 加上分号后报错: 'else' without a previous 'if'
  7. else
  8. printf("else\n");

通过do{}while(0)定义复杂宏

  1. #define MY_MACRO \
  2. do { \
  3. MyFunctionA(); \
  4. MyFunctionB(); \
  5. } while (0) \

避免使用goto对程序流做统一控制

  1. void foo() {
  2. int *pi = new int(10);
  3. do {
  4. // 提前返回时需要释放资源, 防止内存泄漏
  5. if (false) {
  6. break;
  7. }
  8. // 发生异常时需要释放资源, 防止内存泄漏
  9. try {
  10. // do something
  11. } catch (std::runtime_error err) {
  12. break;
  13. }
  14. } while (0);
  15. // 提前返回、发生异常和正常返回时都会走到这里释放资源
  16. delete pi;
  17. pi = nullptr;
  18. return;
  19. }