Макрос с параметром функции, который вызывает функцию - PullRequest
0 голосов
/ 02 мая 2018

Мне нужен макрос, который просто вызывает функцию, которая передается в качестве параметра этому макросу. Функция имеет тип void без параметров.

Например, если у меня есть следующая функция:

void function(void) {
//doSomething
}

Мне нужен макрос APPLY_FUNCTION, который вызывается с параметром function и просто вызывает эту функцию:

APPLY_FUNCTION(function);

Я пытался определить макрос следующим образом:

#define APPLY_FUNCTION(function)    (function)

Но это не работает, когда я пытаюсь вызвать макрос, я получаю ошибку «оператор без эффекта».

Вопрос в том, как мне определить этот макрос?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Быстрая и грязная версия просто так:

#define APPLY_FUNCTION(function) (function)()

где () в конце означает, что это вызов функции.


Я бы предпочел вместо этого использовать безопасную версию C11:

#define APPLY_FUNCTION(function) _Generic((function), void (*)(void): (function)())

Это предотвращает передачу пользователем неправильного вида функции в макрос.

0 голосов
/ 02 мая 2018

Вы, вероятно, хотите это:

#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. Вы не применяете функцию, вы вызываете это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...