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