【发布时间】:2011-01-12 09:48:48
【问题描述】:
我在 C 和 C++ 中都有一种情况,最好用 Python 之类的装饰器来解决它:我有几个函数我想用其他东西包裹起来,以便在函数进入之前语句被执行,当它离开时执行一些其他功能。
例如,我在一个库 C 文件中有一些函数,当调用它们时应该锁定一个信号量,并且在将控制权返回给被调用者之前,应该释放信号量。没有锁,它们具有以下结构:
int f1(int)
{
...
...
}
int f2(char*)
{
....
}
int f3(blabla)
{
....
}
... fn(...)
我想定义一个全局信号量,它应该在每个函数被调用之前被锁定,并在函数返回时被释放。我想尽可能简单地做到这一点;接近这个的东西:
#lockprotected
int f1(int)
{
... /* nothing changed over here */
}
#endlockprotected
或类似的东西
int f1(int)
{
... /* nothing changed over here */
}
#lockprotected f1
我不想要的是:
- 更改函数名称,因为它们是库函数,并且可以从许多地方调用。
- 在返回调用之前明确放置任何语句,因为大多数函数在两者之间有许多早期返回。或者就此而言,更改函数的任何内部结构。
最优雅的方式是什么?
【问题讨论】:
-
您必须决定 C 还是 C++,方法会有所不同,对于 C++,您可以使用 RAII,如下所述,对于 C,您必须将实现移动到单独的函数中,原件就变成了在调用实际实现时具有锁定/解锁功能的包装器 - 下面是@frunsi 答案的变体