1

是否可以编写一个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来检查我们是否处于锁定状态。还有另一种可能的解决方案吗?

4

2 回答 2

3

您发布的代码几乎可以正常工作。稍作修改,它就可以使用 C99 编译器进行编译:

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

但是,与 C++ 保护类不同,它非常容易出错,因为如果使用、或退出块,则unlock_something()不会触发。除此之外,还会有完全不同的含义:returngotobreakbreak

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
  }
}

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

于 2012-12-03T07:46:19.533 回答
2
#include <stdio.h>
typedef void(*vrv)(void);

void before_after(vrv before, vrv func, vrv after) {
  before();
  func();
  after();
}

void b() { printf(" 1 "); }
void a() { printf(" 3 "); }
void f() { printf(" 2 "); }

int main() {
  before_after(b, f, a); 
  return 0;
}
于 2012-12-03T07:37:05.657 回答