Definieren Sie eine Funktion vor main?
Sind Deklarationen/Prototypen notwendig, C99 ?
Ich bin derzeit auf der Definition meiner Funktionen in eine header-Datei und #include-ING es in der Haupt-Datei. Ist das OK in C99 ?
Warum haben die meisten Programmierer deklarieren/der Prototyp der Funktion vor main (), und definieren Sie nach der main() ? Ist es nicht nur leichter, Sie zu definieren, bevor Haupt-und vermeiden Sie alle Deklarationen/Prototypen ?
Inhalt der header.h-Datei:
int foo(int foo)
{
//code
return 1;
}
Inhalt der main-Datei:
#include <stdio.h>
#include "header.h"
int main(void)
{
foo(1);
return 0;
}
InformationsquelleAutor Neeladri Vishweswaran | 2010-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie und wo Prototypen und definieren Sie eine Funktion in C :
Ihre Funktion wird verwendet, nur in einer bestimmten .c-Datei :
Definieren Sie statisch in der .c-Datei. Die Funktion ist nur sichtbar und wurde für diese Datei.
Ihre Funktion verwendet wird, in mehreren .c-Dateien :
Wählen Sie eine entsprechende c-Datei hosten Ihre definition (Alle foo Verwandte Funktionen in foo.c-Datei, zum Beispiel), und eine zugehörige header-Datei, um alle nicht-statischen (denken Sie öffentliche) Funktionen mit Prototyp. Die Funktion wird nur einmal kompiliert, aber sichtbar auf jeder Datei, die enthält die header-Dateien. Alles wird zusammen gestellt werden zur link-Zeit. Mögliche Verbesserung : machen Sie immer die zugehörige header-Datei, die erste, die in der c-Datei, auf diese Weise werden Sie sicher sein, dass jede Datei kann es sicher ohne die Notwendigkeit von anderen gehört, damit es funktioniert, Referenz : Large Scale C++ - Projekte (die Meisten Regeln gelten, C).
Ihre Funktion ist inlinable (sind Sie sicher, dass Sie es ist ?) :
Definieren Sie die Funktion static inline in eine entsprechende header-Datei. Sollte der compiler ersetzen, rufen Sie Ihre Funktion, indem Sie die definition, ob es möglich ist (denke, dass makro-wie).
Den Begriff der vor-nachdem eine andere Funktion (Ihre main-Funktion) in c ist nur eine Frage des Stils. Entweder Sie tun :
Oder
wird in dem gleichen Programm. Der zweite Weg ist die bevorzugte Programmierer, da Sie nicht haben, neu zu organisieren oder erklären, neue Prototypen jedes mal, wenn Sie deklarieren Sie eine neue Funktion, die Nutzung die andere. Plus erhalten Sie eine schöne Liste aller deklarierten Funktionen in Ihrer Datei. Es macht das Leben einfacher auf lange Sicht für Sie und Ihr team.
static foo
's Erklärung in.h
Datei definition in.c
- Datei?Nein, ich denke, Sie würden eine Fehlermeldung erhalten : "'foo' declared 'static' but never defined " für jede Datei das schließt den header ein. Denke, über statische als "local". Es würde keinen Sinn machen zu werben (in einem header-file) etwas, das als lokal für jedermann, es sei denn, Sie bieten es für das lokale kopieren (inlining) für alle.
InformationsquelleAutor Matthieu
Menschen in der Regel tun es, weil es leichter zu machen, mit mehreren Dateien. Wenn Sie deklarieren, die in einem header, dann kann man nur noch #include diesen header irgendwo müssen Sie diese Funktionen. Wenn Sie definieren, Sie in eine Kopfzeile und fügen Sie dann in einer anderen translation unit, bang.
aber mit einer (Uhr -) Hund und statische Funktionen können auf einfache Weise schützen Sie Sie vor dem Knall. Sie möchten vielleicht sogar zu definieren-Funktionen im Header. Warum würden Sie wollen, zu tun, die gefährlich klingen (ist es) ? Die meisten Compiler optimieren Sie die Weise, die besser den code von statischen Funktionen. Kosten Kompilierung und einige code-Duplizierung, wenn Sie nicht den ganzen Weg gehen (define alle ein Programm im Header). Ich bin momentan an einem C++ - Programm von über 40000 Zeilen mit diesem Stil, der funktioniert gut für mich.
InformationsquelleAutor Puppy
Funktion Erklärungen erforderlich sind, in C99. Funktion Prototypen sind nicht erforderlich, in C99.
Deklarieren von Funktionen vor dem Punkt der nennen und definieren Sie nach dem Punkt des Aufrufs ist ein beliebter Ansatz zur Strukturierung des Programmcodes. Dies ist jedoch in keiner Weise das, was die "meisten" Programmierer tun. Im Gegenteil, eine weitere beliebte Ansatz ist definieren - Funktion vor der Stelle der erste Aufruf, in welchem Fall die gesonderte Erklärung nicht erforderlich ist. Dieser Ansatz erfordert weniger Wartung, das ist, warum es ist populärer als das, was Sie beschreiben.
Separaten Deklarationen/Definitionen werden in der Regel verwendet mit externen Funktionen, d.h. Funktionen über mehrere übersetzungseinheiten. Solche Funktionen sind deklariert in der header-Dateien definiert und in Umsetzung Dateien.
InformationsquelleAutor AnT
Sollten Sie immer nur definieren
inline
Funktionen im Header. Sie können zwarextern inline
Funktionen, die häufiger der Fall iststatic inline
.Faustregel für header-Dateien:
extern
static inline
extern
static const
Als C. Ross haben danach gefragt, hier ist die Argumentation hinter es: Eine Ressource mit externen Verknüpfung sollte immer nur einmal definiert werden[1]. Es folgt, dass die Definitionen sich nicht in header-Dateien, die enthalten sein sollen, die in mehr als einem Ort.
Dass
static
Definitionen in header-Dateien führt nicht zu Problemen, sondern ist in der Regel verpönt, weil der code kompiliert werden, mehr als einmal und in verschiedenen Objekt-Dateien, die erhöht die Größe der executables (vorausgesetzt, der linker ist nicht schlau genug, um herauszufinden, die code-Duplizierung).Den gemeinsamen Ausnahmen von dieser Regel sind Konstanten und
inline
Funktionen, die sollen sichtbar sein, um dem compiler in jeder übersetzungseinheit, um weitere Optimierungen möglich.Hinweis: [1] Dies gilt nicht für
inline
Funktionen mit externer Bindung, aber es ist nicht spezifiziert, welche von den mehreren Definitionen von inline-Funktion verwendet werden, bei der Auswertung einer Funktion Bezeichner, sind Sie meist nutzlosVon Ihnen positiv bewertet werden, aber ich habe noch 2 Fragen. 1, Wenn ich eine
static void foo()
in einem Programm soll ich setzenfoo
's Erklärung in das Programm.h
Datei oder.c
- Datei? Ich Stelle diese Frage, weil ich bin verwirrt, sollte.h
Dateien enthält nurextern
Funktionen zugegriffen werden kann, indem mehrere.c
Dateien, die nicht nur eine? 2, habe ich gelernt, dassinline
Funktionen definiert werden sollte, in.h
Dateien, warum sollte das dann verwendenstatic inline
? Hat diestatic
bedeuten die inline-Funktion wird nur sichtbar in einem.c
- Datei?InformationsquelleAutor Christoph
Dein Ansatz ist gut, für kleine Programme. Header-Dateien gemeint sind-Deklarationen und Konstanten-Definitionen - Sie stellen eine Schnittstelle zu dem Programm "Kapseln". Überschriften dienen als eine Schnittstelle für andere Programm-Einheiten.
Falls Sie noch weitere .c-Dateien, forward-Deklarationen und header-Dateien sind notwendig, weil ein C-Funktion kann nur einmal für das ganze Programm (search for one definition rule), obwohl Sie können verwenden Sie die Funktion überall (in jedem .c-Datei). Wenn man es definiert im header, wäre es enthalten .c Dateien, die Sie verwenden, und führen mehrere Definitionen.
wenn etwas gut ist, ist es unklar, tun genau das Gegenteil ist auch nicht gut. Als ich sagte in Kommentar zu DeadMG Antwort, die ich tun, definieren Sie Funktionen in Header, nicht als Gewohnheit, sondern als eine Optimierung, trick und eine Programmier-Stil. Gleiche Idee wie "nur Kopfzeilen" - Klassen von C++, stark gebraucht, die von BOOST. Es wäre wahrscheinlich nutzlos, wenn C oder C++ hatte ein sauberes Konzept der Module verstanden, die durch den compiler (vor dem linken), wie Sie in anderen Sprachen haben, statt diese bloody text-Ebene beinhaltet.
es kann Sinn machen, in C++ vor allem mit den Einschränkungen der templates/meta-Programmierung (auch wenn zu beachten, dass die Zusammenstellung mal Kosten wie Sie sagte), aber ich kann nicht sehen, einen Vorteil header-definition in C mit Ausnahme für inlining. Ich bin damit einverstanden, dass die header-Datei Konstrukt ist ein "Schwachpunkt" für c/c++.
InformationsquelleAutor Karel Petranek
Es ist schneller zu tun, aber ich persönlich bevorzuge die main-Funktion im Anfang der main-Datei, und legen Sie die anderen Funktionen in anderen Dateien oder unten main.
Beachten Sie, dass in Ihrem Beispiel sollten Sie vermeiden, Deklaration von foo() in der header-Datei: Sie werden nicht in der Lage, es in zwei verschiedenen source-Dateien. Erklären Sie es in der C-Datei mit main(); brauchen Sie nicht zu definieren, es an anderer Stelle, es sei denn, man bezieht es von einigen anderen Dateien.
InformationsquelleAutor peoro
Ja, es ist einfacher, Sie zu definieren, bevor main. Wenn Sie nur wollen, verwenden Sie diese Funktionen innerhalb der Datei, ein Prototyp ist nicht nötig. In diesem Fall jedoch, können Sie auch voran, die "static" - Schlüsselwort vor der definition der Funktion. (In der C-Datei.) Das wird dafür sorgen, die Funktion ist nicht sichtbar für andere Dateien. (Zur link-Zeit.)
Nicht setzen statische keywords in den include-Dateien.
hm, das ist nicht das, was ich meinte.
wenn Sie mit der klassischen C-Programmierung Stil, statische Funktionen sollten gar nicht angezeigt im Header.
InformationsquelleAutor Prof. Falken
Sollten Sie immer Prototyp.
Die Gründe dafür sind;
methodische prototyping erzeugt eine prägnante Liste, die in Headerdateien der Funktionen im code - das ist von unschätzbarem Wert für zukünftige Leser
in alles, aber die einfachsten Projekte, die viele Funktionen nicht haben, die Sichtbarkeit vor der main.
main sollte die erste Funktion in der Datei; es ist einfacher für die Leser, da Lesen wir unten, nicht von oben
Wenn ich Schreibe Bibliotheken, die C-Dateien da eine einzelne H-Datei, die interne Bibliothek; enthält Prototypen (die sonst statisch, wenn alle C-Dateien wurden in eine gerollt). Enthält eine Liste der Bibliotheken und private Funktionen. Mit Bezug auf die Datei mit der main, ich bin völlig einverstanden.
InformationsquelleAutor
Nur weil die meisten Menschen sequentiell gelesen. Starten Sie eine Geschichte von Anfang an, nicht in der Mitte. Nicht notwendig, nur intuitiv.
Natürlich, wenn der code Prototyp ist in einem separaten compilation unit, die Prototypen sind notwendig.
InformationsquelleAutor Clifford
Es ist immer eine gute Praxis zu erklären, die Funktionen entweder vor dem Haupteingang oder in eine separate header-Datei, die aufgenommen werden, in anderen c-Dateien, in denen wir verwendet haben, dass Funktion. Durch diese Vorgehensweise können wir leicht identifizieren aller Funktionen deklariert/definiert .C oder .H-Dateien. Und wir sollten Sie nutzen extern-Schlüsselwort vor der Deklaration der Funktion in der header-Datei.
InformationsquelleAutor Vijay Kumar