2010-02-17 13 views
7

Ich bin der Überprüfung einige Optimierungs Bibliotheken und kam über die FunktionssignaturIst dieser gültige Standard c?

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

beachten Sie, dass Spaß() und gard() als Funktion übergeben. Meine Frage ist, ob das eine gültige Standard-C-Grammatik ist.

Danke.

Antwort

7

Die Verwendung von double fun() statt double (*fun)() ist eine archaische Form, , die nur gültig in Standard C und nie in C++ war, und wenn ich mich richtig erinnere, nur dann, wenn ein Funktionsargument deklarieren. (Ähnlich wie ary[], die für ein Funktionsargument ist legal, aber nicht für ein nicht initialisierten Variablen)

Da es nicht möglich ist (in C) eine Funktion von Wert an einem anderen Funktion zu übergeben, der Compiler dauerte nur double fun() bedeuten ein Zeiger auf eine Funktion, die ein Double zurückgegeben hat.

Das ist also gültig (aber archaisch. hat in Ungnade gefallen)

+6

Nicht wahr in C++. Das Formular ist sowohl in Standard C als auch in Standard C++ genau gültig. Es ist absolut nichts Archaisches daran.Der Funktionstyp in Parameterdeklarationen verfällt genau so wie der Array-Typ in Parameterdeklarationen zum Zeigertyp. Beide funktionieren genau in C und C++ (abgesehen von der Bedeutung von '()' Parameterliste, die neben dem Punkt in diesem Fall ist). – AnT

+0

@AndreyT: ungerade dann, dass Sie nie diese Form verwendet sehen, aber ich werde die Antwort ändern –

+0

'Array []' ist zulässig für eine Variable bei der Verwendung einer Initialisierungsliste. 'int array [] = {2, 3, 5, 7, 11, 13};' – wallyk

1

Ihre Array-Parameter (x und Optionen) sollten wahrscheinlich Zeiger sein.

Mit einer Funktion in Klammern, wie "func()" oder "gradc()" wird die Funktion aufgerufen. Der Name der Funktion allein ist ein Codezeiger, der dereferenziert werden kann, um die fragliche Funktion aufzurufen.

Versuchen Sie im Zweifelsfall, dies mit einem ANSI C-Compiler zu kompilieren - viele Compiler bieten einen ANSI-Kompatibilitätsschalter, um die Einhaltung von Standards zu erzwingen. Auch die K&R book ist dein Freund.

Ist das eine Hausaufgabenfrage?

+0

Sie können dieser Art und Weise gedacht werden, aber in dieser Erklärung 'double x []' und 'double * x' sind gleichwertig. –

+0

Nein, mein Herr, das ist keine Hausaufgabenfrage. Ich bin nicht einmal ein Programmierer, aber ich werde gebeten, etwas c-Code zu überprüfen. – leon

2

func() und gradc() sind in der richtigen Form für Funktionen mit unbekannten Parametern. Ich bin mir ziemlich sicher, dass dies sogar für Unix 6 um 1975 eine akzeptable Syntax war.

Die [] Parameter sind die gleichen wie *, jetzt und in der Vergangenheit. In der Tat, ich erinnere mich einen 1980er Jahren Streit über die war geeignetere:

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

oder

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

Es ist nicht anders als in der Tat. Der Streit ist der Semantik nach richtiger.

+1

Ich habe es immer vorgezogen, '[]' nicht in Funktionsparametern zu verwenden. '* argv []' ist visuell verwirrender als '** argv', und wenn Sie Klammern verwenden, neigen neue C-Programmierer dazu, zu glauben, dass die Variable tatsächlich ein Array und nicht ein Zeiger ist, und versuchen etwas böses' sizeof (x)/sizeof (x [0]) '-Typ Operation darauf. Am besten (IMHO), um es vollkommen klar zu machen, dass es kein Array ist und nicht als ein Array behandelt werden sollte. –

+2

Ich war immer in der Minderheit befürworten ** Argv. Ich bin froh, einen anderen Bruder zu finden. – wallyk

Verwandte Themen