Меня смущает следующая функция C, f_2(). Он написан в файле .c, код может быть скомпилирован gcc. Как называется этот функциональный стиль? Как интерпретировать значение этой функции? Это стандартный C или какое-то расширение gcc? Спасибо.
void f_1()
{
}
int (*f_2(void *param)) (int, void *) {
return 0;
}
int main()
{
f_2(NULL);
return 0;
}





Функция f_2 принимает void * аргументов и возвращает указатель на функцию.
Указатель, который возвращает f_2, — это указатель на функцию, которая принимает два аргумента (int и void *) и возвращает int.
Это эквивалентно:
// Create a type-alias for a function pointer
typedef int (*function_pointer_type)(int, void *);
// Define a function that returns a pointer to a function
function_pointer_type f_2(void *)
{
return NULL;
}
Я не помню, чтобы когда-либо использовал указатели на функции, не указывая их тип. Обозначение без typedef настолько странное, что я полагаю, что оно сбивает с толку большинство людей, даже опытных программистов на C.
с C23 можно просто написать typeof(int(int,void*)) * f2(void*)
Визуальный анализ определения C можно выполнить с помощью правила спирали:
int (*f_2(void *param)) (int, void *) {
start для определяемого идентификатора, здесь f_2:
f_2 - это...
читать и писать постфиксные операторы слева направо: (void *param):
f_2 — это функция, принимающая void * аргумент с именем param, возвращающая...
когда вы столкнетесь с препятствием (), ;, ,, {...), вернитесь к тому, с чего вы начали анализировать постфиксные операторы и анализировать префиксные операторы справа налево: здесь только *, поэтому:
f_2 — это функция, принимающая void * аргумент с именем param, возвращающая указатель на...
вы проанализировали выражение в скобках, поэтому начните снова с его постфикса, а затем префиксных операторов: (int, void *):
(f_2 — это функция, принимающая аргумент void * с именем param, возвращающая указатель на а) функцию, принимающая аргументы int и void *, возвращающая...
вернуться к ( и разобрать префиксные операторы: есть только возвращаемый тип int, поэтому последняя фраза:
f_2 — это функция, принимающая аргумент void * с именем param, возвращающая указатель на функцию, принимающая аргументы int и void *, возвращающая int.
Вы также можете прочитать этот вопрос и ответы на него: C не так сложно: void ( *( *f[] ) () ) ()
Проголосовал за подробное объяснение расшифровки этого объявления. Длина и сложность объяснения дает веские основания для использования typedef, чтобы помочь плохому читателю кода.
Таким образом, вызов
f_2(NULL)отбрасывает возвращаемую функцию, принимаяintиvoid *