Я рассматриваю некоторые библиотеки оптимизации и столкнулся с функциональной подписью
double solvopt(unsigned short n,
double x[],
double fun(),
void grad(),
double options[],
double func(),
void gradc()
)
обратите внимание, что забава () и делаемый () передается как функция. Мой вопрос состоит в том, если это - действительный стандарт C грамматика.
Спасибо.
Использование double fun()
вместо double (*fun)()
- это архаичная форма, которая была действительна только в стандартном C и никогда в C++, и, если я правильно помню, только при объявлении аргумента функции. (подобно ary[]
, который законен для аргумента функции, но не для неинициализированной переменной)
Поскольку в Си невозможно передать функцию по значению другой функции, компилятор просто принял double fun()
за указатель на функцию, возвращающую двойное значение.
Так что это допустимо (но архаично. вышло из употребления)
func ()
и gradc ()
в правильной форме для функций с неизвестными параметрами. Я почти уверен, что это был приемлемый синтаксис даже для Unix 6 примерно 1975 года.
Параметры []
такие же, как *
, сейчас и в прошлом. На самом деле, я помню спор 1980-х о том, что было более уместно:
int main (int argc, char **argv, char **envp)
или
int main (int argc, char *argv[], char *envp[])
По сути, разницы нет. Спор заключается в том, что по семантике правильнее.
Параметры вашего массива (x и параметры), вероятно, должны быть указателями.
Ссылка на функцию в круглых скобках, например «func ()» или «gradc ()», вызывает функцию. Само имя функции - это указатель кода, который можно разыменовать для вызова рассматриваемой функции.
Если есть сомнения, попробуйте скомпилировать это с помощью компилятора ANSI C - многие компиляторы предоставляют переключатель совместимости ANSI для обеспечения соответствия стандартам. Кроме того, книга K&R - ваш друг.
Это вопрос домашнего задания?