В чем разница между void f () и void (* f) ()? И какой синтаксис можно написать при работе с указателями на функции? - PullRequest
0 голосов
/ 03 мая 2020
void F(void f(), void(*v)())
{

}

Насколько я понимаю, два параметра имеют одинаковый тип, оба являются указателями на функцию, которая ничего не берет и возвращает void. Что это за два способа написания? Если они оба - одно и то же, то почему void f() не так популярен, как void(*f)()? Первый выглядит проще, так как выглядит так, как пишутся нормальные функции. Также какой синтаксис можно использовать при работе с указателями на функции? Или где их найти? Вот некоторые из них, которые мне удалось получить:

#include <iostream>
#include <vector>

void func1()
{
    std::cout << "func1\n";
}

void (*returnFunc1())()
{
    return func1;
}

auto returnFunc1_2() -> void(*)()
{
    return func1;
}

void func2(int x)
{
    std::cout << "func2 " << x << "\n";
}

auto returnFunc2() -> void(*)(int)
{
    return func2;
}

int func3(int, bool)
{
    std::cout << "func3\n";
    return 0;
}

int (*returnFunc3(long long))(int, bool)
{
    return func3;
}

void func4(void f(), void(*v)())
{
    std::cout << "func4\n";
}

void (*returnFunc4())(void(), void(*)())
{
    return func4;
}

int main()
{

    void (*funcPointer)() = func1;
    funcPointer();

    std::vector<void(*)()> v;
    v.push_back(func1);
    v.back()();

    returnFunc2()(123);

    returnFunc3(123)(456, true);

    returnFunc4()(func1, func1);
}

Можно ли использовать какой-либо другой синтаксис? Мне просто любопытно.

Например, что означает int (*(*foo)(void ))[3]? Как читать такие высказывания? Или где я могу узнать о прочтении таких крипт c заявлений?

...