Мне нужен макрос, который просто вызывает функцию, которая передается как параметр этому макросу. Функция имеет тип void без параметров.
Например, если у меня есть следующая функция:
void function(void) {
//doSomething
}
Мне нужен макрос APPLY_FUNCTION, который вызывается с параметром функция и просто вызывает эту функцию:
APPLY_FUNCTION(function);
Я пытался определить макрос как:
#define APPLY_FUNCTION(function) (function)
Но это не работает, когда я пытаюсь вызвать макрос, я получаю ошибку «оператор без эффекта».
Вопрос в том, как мне определить этот макрос?
Это может быть XY проблема. Действительно, такой макрос был бы совершенно бесполезен. Но «Применить» звонит в колокол, вы пытаетесь реализовать Применить HOF? Это не сработает с макросом.
Вы, наверное, захотите этого:
#include <stdio.h>
#define APPLY_FUNCTION(functionname) functionname()
void function(void) {
printf("Function called\n");
}
int main()
{
APPLY_FUNCTION(function);
}
Выход:
Function called
С вашим определением:
#define APPLY_FUNCTION(function) (function)
Препроцессор генерирует следующую строку:
(function);
Это синтаксически правильно, но не вызывает функцию, отсюда и предупреждение.
Кстати: вы должны называть макрос скорее CALL_FUNCTION
. Вы не применять функцию, вы вызов ее.
Быстрая и грязная версия такова:
#define APPLY_FUNCTION(function) (function)()
где ()
на конце означает, что это вызов функции.
Однако я бы предпочел вместо этого использовать безопасную версию C11:
#define APPLY_FUNCTION(function) _Generic((function), void (*)(void): (function)())
Это предотвращает передачу пользователем макроса неправильной функции.
Какой смысл в этом макросе? Почему бы просто не вызвать функцию?