Что такое void (* pfunc [3]) ()? - PullRequest
       9

Что такое void (* pfunc [3]) ()?

0 голосов
/ 15 января 2020

У меня есть эта строка кода в моем коде. что такое void (*pfunc[3])()?

uint32_t Var1 = 1, Var2 = 2, Var3 = 3;
void (*pfunc[3])();
pfunc[0] = Var1;
pfunc[1] = Var2;
pfunc[2] = Var3;

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Фрагмент кода не имеет смысла.

Этот

void (*pfunc[3])();

является объявлением массива из трех элементов указателей на функции типа void(). Более того, ничего не известно о параметрах функции.

С другой стороны. это объявление

uint32_t Var1 = 1, Var2 = 2, Var3 = 3;

объявляет три объекта типа uint32_t.

Таким образом, компилятор должен выдать как минимум предупреждение о том, что неявного преобразования из типа uint32_t в не существует введите void (* )() для таких утверждений

pfunc[0] = Var1;
0 голосов
/ 15 января 2020

Добавление к ответу @ VladfromMoscow.

Синтаксис строки, о которой вы спрашиваете, может выглядеть немного странно, если вы не знакомы с подобными вещами. Если вы переформулируете его как:

typedef void (*fn_ptr_t)();   
  // fn_ptr_t is a type of pointer, pointing to a function returning void and taking no arguments.

...

fn_ptr_t pfunc[3];
  // an array of three fn_ptr_t's

, тогда может быть немного понятнее. В частности, ваше объявление массива теперь выглядит как «нормальный» массив (например, int numbers[4]).

Вы можете утверждать, что странный синтаксис C теперь отбросил путаницу на один шаг в typedef ... Попробуйте это: Указатель функции Typedef?

0 голосов
/ 15 января 2020

ваш пример не имеет особого смысла, но

void foo()
{
    printf("foo\n");
}

void bar()
{
    printf("bar\n");
}

void goo()
{
    printf("goo\n");
}



int main()
{
    uint64_t Var1 = (uint64_t)foo, Var2 = (uint64_t)bar, Var3 = (uint64_t)goo;
    void (*pfunc[3])();
    pfunc[0] = (void (*)())Var1;
    pfunc[1] = (void (*)())Var2;
    pfunc[2] = (void (*)())Var3;

    pfunc[0]();
    pfunc[1]();
    pfunc[2]();
}

Var1, Var2, Var3 сохраняют адреса функций.

void (*pfunc[3])(); - объявляет массив из трех указателей на функции

pfunc[2](); - разыменовывает указатель на функцию - ie вызывает указанную функцию

https://godbolt.org/z/VUpfLl

PS uint64_t был использован, потому что целое число должно иметь размер, по крайней мере, такой же, как размер указателя. Моя система 64-битная, поэтому указатели 64-битные.

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