Есть ли макрос C, который оборачивает функцию - PullRequest
0 голосов
/ 21 февраля 2020

Есть ли способ сделать что-то вроде того, что я хотел сделать с этим синтаксисом:

#define WRAP_MY_FUNCTION(x){Y} void x(int integer){printf("begin\n"); Y ; printf("end\n");}

Таким образом, я могу получить это

WRAP_MY_FUNCTION(Foo){printf("hello world\n");}

, что эквивалентно

void Foo(int integer)
{
    printf("begin\n");
    printf("hello world\n");
    printf("end\n");
}

для вывода

begin
hello world
end

Примечание. Я бы предпочел иметь код функции в скобках, чтобы конечный пользователь понимал, что это блок кода.

1 Ответ

0 голосов
/ 21 февраля 2020

Вы можете передать другой параметр в макрос, чтобы определить оператор вывода.

Примерно так:

#define WRAP_MY_FUNCTION(x, Y) void x(int integer){printf("begin\n"); Y; printf("end\n");}

WRAP_MY_FUNCTION(Foo, printf("hello world\n"))

Если вы хотите прояснить для конечного пользователя, что это блок кода и, как указал Ричи, добавление Variadi * Макрос 1008 * для исправления незащищенных запятых, которые могут быть в вашем источнике, вы можете переписать определение следующим образом:

#define WRAP_MY_FUNCTION(x, ...)\
    void x(int integer)         \
    {                           \
        printf("begin\n");      \
        __VA_ARGS__             \
        printf("end\n");        \
    }                           \
...