2014-11-27 2 views
5

Недавно я узнал, что это законно C:Альтернативный синтаксис функций C, принимая другую функцию в качестве параметра

#include <stdio.h> 

int foo(int bar(int)) 
{ 
    return bar(42); 
} 

int bar(int x) 
{ 
    return x * 42; 
} 

int main() 
{ 
    printf("Baz = %d\n", foo(bar)); 
    return 0; 
} 

компилируется без предупреждений и работает как и ожидалось (компилирует и отлично работает даже в качестве программы C, а не C++)

rep ~/Documents $ g++ -Wall test.cpp 
rep ~/Documents $ ./a.out 
Baz = 1764 
rep ~/Documents $ 

Почему не этот синтаксис используется чаще или даже упоминается в любом месте?

+2

Интересно ... не видел этот синтаксис перед собой. Ожидал бы, что подпись будет читать 'int foo (int (* bar) (int))'. – bgoldst

+7

В списках параметров типы функций настраиваются на указатель на функцию, точно так же, как тип массива настраивается на указатель на элемент. –

+1

Это точно так же, как 'int foo (int (* bar) (int))'. Не уверен, почему он часто не используется. – 0x499602D2

ответ

-6

Возможно, потому что вы можете вызвать функцию внутри другой функции. Это лучше, чем функция в качестве параметра. Хотя используется фреймворками для выполнения функций обратного вызова. Я предпочитаю функцию от другой функции как обычный разработчик.

+0

Это не имеет никакого отношения к вызовам функций внутри других функций. Его смысл заключается в использовании синтаксиса, отличного от указателя на синтаксис функции. –

Смежные вопросы