Выражение func(id)
возвращает указатель на функцию, которая принимает float как аргумент и возвращает float.
float(*f)(float v); // pointer to a function
float val;
f = func(3); // returns a pointer to a function
val = (*f)(3.14); // calls the function pointed to with argument 3.14
Конечно, можно переписать последнее утверждение:
val = (*func(3))(3.14); // take the ptr returned by func(3) and call the function pointed to.
Если у вас есть функция, как:
float fct1 (float v) { return 2.0f*v+3.1f; }
вы могли бы написать:
f = fct1; // reassign the pointer to function f to the adress of fct1
Давайте посмотрите на синтаксис. Стандарт C11 (проект N1570) указывает в пункте 6.5.2.2 пункт 1: «Выражение, обозначающее вызываемую функцию) должно иметь указатель на функцию« и в пункте 3, что: ». Постфиксное выражение, за которым следуют скобки() содержащий возможно пустой список выражений, разделенных запятыми, является вызовом функции. "
Это относится, конечно, обычные случаи:
val = fct1 (3.14); // fct1 is the function designator which adresses the function
val = (*f) (3.14); // (*f) the dereferenced function pointer, so it addresses the function
Но следующий справедливо и в соответствии со стандартом:
val = f(3.14); // This works as well, because f is a pointer to a function
val = func(3)(3.14) // works also because func(3) is a pointer to a function
Однако первое выражение является неоднозначным для человеческого читателя, который может думать f в качестве обозначения функции, ожидая, что он будет определен где-то. И второе необычно. Более того, более ранние версии C не распознавали их. My K & R edition 1978 года потребовал формы (* f)() для вызова указателя функции.
Последнее синтаксическое замечание: если вы определили бы f как float *f (float);
, это не было бы понято как указатель на функцию, а как прямое объявление простой функции с именем f и возвращающее указатель на float. Зачем ?Потому что C precedence rules дает ()
более высокий приоритет, чем *
, что означает, что компилятор понимает его как (float *)(f(float))
. Вот почему явная скобка требуется, чтобы показать, что (*f)
является указателем функции.
Не стоит добавлять в ответ, но 'cdecl' это инструмент командной строки, которая будет объяснить это для вас , – abligh