Это действительный стандарт с? - PullRequest
7 голосов
/ 18 февраля 2010

Я просматриваю некоторые библиотеки оптимизации и наткнулся на сигнатуру функции

double solvopt(unsigned short n,
           double x[], 
           double fun(), 
           void grad(),
           double options[],
           double func(),
           void gradc()
          )

обратите внимание, что fun () и gard () передаются как функции. У меня вопрос, если это допустимая стандартная грамматика C.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 18 февраля 2010

Использование double fun() вместо double (*fun)() является архаичной формой, , которая действительна только в стандарте C и никогда в C ++, и, если я правильно помню, только при объявлении аргумента функции. (очень похоже на ary[], что допустимо для аргумента функции, но не для неинициализированной переменной)

Поскольку невозможно (в C) передать функцию по значению другой функции, компилятор просто взял double fun(), чтобы обозначить указатель на функцию, которая вернула значение типа double.

Так что это действительно (но архаично. потерял самообладание)

2 голосов
/ 18 февраля 2010

func() и gradc() находятся в надлежащем виде для функций с неизвестными параметрами. Я почти уверен, что это был приемлемый синтаксис даже для Unix 6 около 1975 года.

Параметры [] такие же, как *, сейчас и в прошлом. На самом деле, я помню спор 1980-х годов, который был более правильным:

int main (int argc, char **argv, char **envp)

или

int main (int argc, char *argv[], char *envp[])

Нет различий в действии. Спор, который является более правильным в соответствии с семантикой.

1 голос
/ 18 февраля 2010

Параметры вашего массива (x и параметры), вероятно, должны быть указателями.

Обращение к функции с круглыми скобками, например, "func ()" или "gradc ()", вызывает функцию. Одно только имя функции является указателем кода, который может быть разыменован для вызова рассматриваемой функции.

Если вы сомневаетесь, попробуйте скомпилировать его с помощью компилятора ANSI C - многие компиляторы предоставляют переключатель совместимости ANSI для обеспечения соответствия стандартам. Кроме того, книга K & R - ваш друг.

Это домашнее задание?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...