是否可以编写一个C宏,在代码块之前执行一些操作,在代码块之后执行另一个操作?

int is_locked;
#define LOCKED for(is_locked = 1, lock_something(); is_locked; is_locked = 0, unlock_something())

LOCKED{
    ...
    do_something_under_lock();
    ...
}

这是可行的;但是,它需要变量is_locked来检查我们是否处于锁定状态。还有其他可能的解决办法吗?

最佳答案

你发布的代码几乎可以工作稍加修改,即可使用C99编译器编译:

#define LOCKED for(int lockvar = (lock_something(), 1);       \
                   lockvar; \
                   lockvar = 0, unlock_something())

但是,与C++守护类不同,它非常容易出错,因为如果该块退出了unlock_something()returngoto,则break不会触发。除此之外,break将具有完全不同的含义:
for (i = 0; i < x; i++) {
  LOCKED {
    if (condition)
      break;  // exits the LOCKED block, not the loop -- WITHOUT unlocking
    if (other_condition)
      return; // returns from function, but never unlocks
  }
}

生产代码中不建议使用此方法。

关于c - C中的带打开文件的宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13678925/

10-12 18:04
查看更多