Значение int в этом выражении

Я не мог понять, что именно означает внутреннее "int" в следующем синтаксисе.

int(*(*ptr (int))(void)

Мое понимание этого выражения говорит о том, что ptr указатель на функцию ничего не принимает в качестве аргумента (из пустой части выражения) и возвращает int (от int в начале). Но что int после ptr имею в виду?

Изменить: Извинения, но вопрос в самом вопроснике был опечатан. Вот выражение

int (*ptr (int))(void)

1 ответ

Решение

Из стандарта С, signal() функция имеет довольно сложную сигнатуру:

void (*signal(int sig, void (*func)(int)))(int);

signal() функция принимает два аргумента, int и указатель на функцию, которая принимает int аргумент и возврат void; он возвращает указатель на функцию, которая принимает int аргумент и возврат void - тот же тип, что и его второй аргумент.

Это сложнее, чем ваш код, но его можно свести к вашему примеру, а именно:

int (*ptr(int))(void);

Работаем шаг за шагом:

void (*signal(int sig, void (*func)(int)))(int);
void (*signal(int sig))(int);  // Remove second argument
void (*signal(int))(int);      // Remove argument name
int  (*signal(int))(int);      // Change return type
int  (*ptr(int))(int);         // Change name of function
int  (*ptr(int))(void);        // Remove argument of returned pointer to function

Таким образом, в контексте это означает, что ваше заявление является декларацией ptr это функция, которая принимает int аргумент и возвращает указатель на функцию, которая не принимает аргумента и возвращает int значение. Реализация (определение) функции даст имя аргумента внутреннему int,

Пример кода - с ptr переименован в function:

#include <stdio.h>
#include <stdlib.h>

static int counter(void) { static unsigned short val = 0; return ++val; }

static int (*function(int arg))(void)
{
    switch (arg)
    {
    case 0:
        return rand;
    default:
        return counter;
    }
}

int main(void)
{
    int (*func)(void);

    func = function(0);
    printf("F() = %5d\n", func());
    printf("F() = %5d\n", func());
    printf("F() = %5d\n", func());

    func = function(1);
    printf("F() = %5d\n", (*func)());
    printf("F() = %5d\n", (*func)());
    printf("F() = %5d\n", (*func)());

    return 0;
}

Пример вывода:

F() = 16807
F() = 282475249
F() = 1622650073
F() =     1
F() =     2
F() =     3

Я полагаю, я мог бы добавить assert(sizeof(unsigned short) != sizeof(int));,

Другие вопросы по тегам