在C中使用打开文件宏

时间:2012-12-03 07:27:59

标签: c macros c-preprocessor

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

2 个答案:

答案 0 :(得分:3)

您发布的代码几乎可以使用。稍作修改,这将使用C99编译器进行编译:

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

然而,与C ++保护类不同,它非常容易出错,因为如果使用unlock_something()return退出该块,goto触发或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
  }
}

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

答案 1 :(得分: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;
}