Задать вопрос

Как правильно передавать функцию в качестве параметра?

Всем привет.
Объясните пожалуйста чем такой вариант:
void fooPrint(void foo()) {
    foo();
}

отличается от вот такого:
void fooPrint(void (*foo)()) {
    foo();
}


Синтаксически понятно что во втором случае передается указатель на функцию, а в первом передается получается вся функция, я правильно понимаю? И это плохо с точки зрения производительности. Хотя в первом и во втором случае sizeof(foo) выдает одинаково 8 байт...
  • Вопрос задан
  • 436 просмотров
Подписаться 4 Простой 1 комментарий
Решения вопроса 1
@res2001
Developer, ex-admin
Оба варианта правильные. Имя функции это и есть указатель на функцию, так что sizeof(foo) == sizeof(&foo). По сути тут компилятор просто игнорирует операцию взятия адреса от функции.
Вся функция никогда не передается - только указатель.

Я бы предпочел второй вариант, т.к. тут явно указано, что надо передавать указатель на функцию.
На самом деле тип указателя на функцию я бы оформил через typedef, и в параметре указывал бы уже имя типа:
typedef void (*foo_t)();
void fooPrint(foo_t foo) {
    foo();
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Если компиллятор глотает оба варианта и тесты проходят - то я-бы взял просто первый вариант.

Там меньше букв.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы