Как реализовать декораторы в C и C ++

У меня есть ситуация как в 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

Чего я не хочу, так это:

  1. Изменять имена функций, поскольку они являются библиотечными функциями и вызываются из многих мест.
  2. Явно размещайте любой оператор перед вызовами возврата, так как большинство функций имеют много ранних возвратов между ними. Или, если на то пошло, измените все внутренние компоненты функции.

Какой способ был бы наиболее элегантным?

11
задан sharjeel 12 January 2011 в 09:54
поделиться