2009-06-03 2 views
2

Ich arbeite mit einigen C-Code, der keine Funktions-Prototypen für eine bestimmte Klasse von Funktionen enthält. Gibt es Vorteile, keine Funktionsprototypen zu verwenden? Die Funktionen rufen sich niemals gegenseitig an und haben keine Parameter. Der Code ändert sich sehr, vielleicht ist es nur eine Zeile weniger zu bearbeiten?Gibt es Vorteile, KEINE Funktionsprototypen in C zu verwenden?

Antwort

5

Funktionsprototypen sind für externe Funktionen. Meine Regel ist, dass jede nicht statische Funktion einen Prototyp erhält, mit Ausnahme von main(). Ich verwende die GCC-Option "-Wissing-Prototypen". Normalerweise fängt es an, wenn ich vergesse, eine Funktion als statisch zu deklarieren.

Auch deklarieren Funktionen in C auf diese Weise:

void function(void); 

Und nicht auf diese Weise:

void function(); 

Da die zweite Art und Weise bedeutet, dass die Funktion eine unbestimmte Anzahl von Parametern definiert, die ‚isn t was Sie wollen (es ist für die Kompatibilität mit Pre-ANSI C).

+2

Ich verwende auch Prototypen für statische Funktionen, am Anfang der .c-Datei. Kein Grund, nicht, so müssen Sie sich nicht um die Reihenfolge kümmern, in der sie umgesetzt werden. – gnud

+0

Ich habe früher Prototypen für statische Funktionen benutzt, bin aber seither nicht mehr zu überzeugen. Wenn Sie einen Prototyp haben, wiederholen Sie Informationen an zwei Stellen. Für eine Schnittstelle ist es notwendig, aber warum mit statischen Funktionen? –

+0

@Chris: weil einige Compiler unsichere Annahmen über Parameter machen, wenn es keinen Prototyp im Umfang gibt. –

0

Der einzige Vorteil, den ich sehe, ist, dass Sie die Funktionsprototypen nicht jedes Mal aktualisieren müssen, wenn Sie die Funktionen selbst ändern.

+1

Das ist nur Faulheit. – akappa

1

"also vielleicht ist es nur eine Zeile weniger zu bearbeiten?"

Das ist der einzige mögliche "Vorteil" in diesem Fall, einfache Faulheit.

1

Weniger Code zum Ändern ist der einzige "Vorteil", den ich mir vorstellen kann. In der Regel ist dies nur "faul"

In jedem Fall sind die Nachteile wichtiger: Sie müssen die Funktionen alle in einer Quelldatei haben; Reihenfolge der Funktionen in der Quelldatei ist jetzt wichtig, etc. Auch andere Leute werden verwirrt sein, um auf/für die Header-Datei zu suchen ... Best Practice ist zu .c und .h es.

4

Nein.

Und ich weiß nicht, ob es in strengen ansi c sogar legal ist.

+2

Es ist legal, keine Prototypen zu verwenden. Es ist nicht legal, nicht deklarierte Funktionen zu verwenden. Alle Prototypen sind Deklarationen, aber einige Deklarationen sind keine Prototypen. Nur für variadische Funktionen sind Prototypen zwingend erforderlich. –

0

Der Code ändert sich sehr, also ist es vielleicht nur eine Zeile weniger zu bearbeiten?

Ich denke, das ist der Grund. Ich kann mir keinen anderen Grund vorstellen - weder ändert sich die Übersetzungsgeschwindigkeit (praktisch), noch die Ausführungszeit, nur die Zeit für die Aktualisierung des Codes.

2

"Code ändert sich viel", wenn auf Funktionsprototypen angewendet wird, ist auch ein schlechter Code-Geruch. Wenn sich die Schnittstelle (Funktionssignatur) stark ändert, sind die Verantwortlichkeiten einer Funktion wahrscheinlich nicht sehr klar. Arbeiten Sie zuerst, um herauszufinden, wie Sie das Problem in Unterverantwortlichkeiten aufteilen und erst danach Code schreiben.

0

Der einzige Vorteil, den ich mir vorstellen kann, ist, dass Sie die erste Zeile der Funktion kopieren und in den Prototypenbereich Ihrer .c oder .h Datei einfügen müssen.

Für Funktionen, auf die in anderen Dateien verwiesen wird, bleibt Ihnen nichts anderes übrig, als einen Prototyp zu haben.

Für Funktionen mit Dateiumfang (d. H. Statische Funktionen) ist es nützlich, alle Prototypen in einem Block am Anfang der Datei zu haben.Auf diese Weise kann jede statische Funktion von einer beliebigen anderen Stelle in dieser Datei aufgerufen werden. Ohne Prototypen kann die Funktion A() nur die Funktion B() aufrufen, wenn B() darüber im Code deklariert ist.

Außerdem machen einige Compiler unsichere Annahmen über Parameter, wenn es keinen Prototyp im Umfang gibt.

Zusätzlich, wenn Sie Code schreiben, der MISRA-C entsprechen muss, ist es eine Voraussetzung, dass alle Funktionen einen Prototyp im Umfang haben.

Ich würde auch dafür eintreten, sicherzustellen, dass der Prototyp die Parameternamen enthält, nicht nur deren Typen (was legal ist), da er den Zweck der Parameter nur durch den Blick auf den Prototyp verdeutlicht.

0

Es ist weniger Tipparbeit, also vielleicht reduziert das Ihr Risiko für RSI.

Verwandte Themen