Значение 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));
,