是否可以编写一个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()
、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
}
}
生产代码中不建议使用此方法。
关于c - C中的带打开文件的宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13678925/