Forum: PC-Programmierung Organisation Quelltextdateien: Static functions


von Walter T. (nicolas)


Lesenswert?

Guten Morgen,

eigentlich sollte ich diese Frage schon vor lange Zeit geklärt haben, 
aber bislang gab es nach gründlicher Betrachtung nie einen Anlaß, von 
den beiden klassischen *.c und *.h-Dateien abzuweichen.

In einem "großen" C Projekt sind (grob) in den *.c-Dateien Quelltexte, 
die Speicherplatz belegen, in *.h Dateien Quelltexte, die keinen 
belegen.

"static inline"-Funktionen sind in den Headerdateien, weil sie von 
mehreren *.c-Dateien includiert werden (können), und der Speicherplatz 
wird ja auch der aufrufenden Funktion zugeschlagen. So paßt das.

Jetzt habe ich einen Haufen kleiner statischer Funktionen (nicht inline- 
das soll der Compiler/Linker selbst entscheiden), die von genau einer 
Funktion aufgerufen werden. Logisch gehörten sie in die Quelltextdatei 
ebenjener Funktion. Allerdings geht in der schieren Menge dieser 
"Kleinfunktion" die Hauptfunktion unter. Also gehörten sie in eine 
separate Datei. *.c-Datei paßt nicht, weil ich dem Compiler die 
Möglichkeit zum Inlinen nicht nehmen will. *.h-Datei paßt nicht, weil 
sie nur von einer einzigen *.c-Datei includiert werden sollen.

Wie geht ihr bei dieser Klasse von Funktionen vor?

: Verschoben durch Moderator
von Where is Waldo?? (Gast)


Lesenswert?

Walter T. schrieb:
> Wie geht ihr bei dieser Klasse von Funktionen vor?

a) Als static inline mit in die .c schmeißen und Kommentardichte 
erhöhen.

b) Als static inline in eine ".walter"-Datei schmeißen und diese in der 
.c includieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Allerdings geht in der schieren Menge dieser "Kleinfunktion" die
> Hauptfunktion unter. Also gehörten sie in eine separate Datei

Nö, denn das widerspricht dem Konzept von static.

Eine Konvention, damit umzugehen, wäre es, alle nicht-statischen 
Funktionen vor den statischen unterzubringen.

von Walter T. (nicolas)


Lesenswert?

Rufus Τ. F. schrieb:
> Eine Konvention, damit umzugehen, wäre es, alle nicht-statischen
> Funktionen vor den statischen unterzubringen.

Das habe ich ja. Dadurch ist immer viel Scrollarbeit zwischen der 
funktionsreichen Hauptfunktion und den Kopfzeilen nötig, weil die vielen 
funktionsarmen Mini-Funktionen dazwischenliegen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Früher habe ich in Fällen wie dem von dir beschriebenen einen Teil der
Quellcodedatei in eine zweite .c-Datei ausgelagert und diese per
#include eingebunden. Dabei war ich mir nie ganz sicher, ob ich der
includierte Datei die Extension .c, .h oder .irgendwasanderes geben
sollte. Schließlich habe ich mich für das .c entschieden, aber auch .h
wäre IMHO in Ordnung.

Heute, im Zeitalter verbesserter Navigationsfunktionen in Editoren und
IDEs mach ich das höchstens noch bei automatisch generierten .c-Dateien.

von A. S. (Gast)


Lesenswert?

Walter T. schrieb:
> Das habe ich ja. Dadurch ist immer viel Scrollarbeit zwischen der
> funktionsreichen Hauptfunktion und den Kopfzeilen nötig, weil die vielen
> funktionsarmen Mini-Funktionen dazwischenliegen.

Dann benutzt Du keinen, oder einen unzureichenden Editor.

Seit 20 Jahren (CW als Referenz) bieten alle Windows-Editoren Ansichten, 
in denen z.B. die Funktionen aufgelistet werden. Alternativ kannst Du 
z.B. oben eine Sprungmarke zu den "Hauptfunktionen" einbauen (z.B. 
einfach den Namen hinschreiben und mit einem Click "suchen", auch das 
bieten alle Editoren. Oder Du hast ein Trennungszeichen, dass der Editor 
per default faltet, oder oder oder.

Notepad ist kein Editor.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Das habe ich ja. Dadurch ist immer viel Scrollarbeit zwischen der
> funktionsreichen Hauptfunktion und den Kopfzeilen nötig, weil die vielen
> funktionsarmen Mini-Funktionen dazwischenliegen.

Wenn die Hauptfunktion vor den "funktionsarmen Mini-Funktionen" liegt, 
wie soll dann viel Scrollarbeit nötig sein?
1
// Header-kommentar
2
3
#include-orgie
4
5
... lokale prototypen
6
7
"Hauptfunktion"
8
9
... statische "funktionsarme Minifunktionen"

von Le X. (lex_91)


Lesenswert?

Für Module, die aufgrund der Größe/Komplexität aus mehreren .c-Files 
bestehen habe ich oft einen "private-Header".
Da kommt alles an Information rein was in jedem der .c-Files gebraucht 
wird, aber nicht Teil des öffentlichen Interfaces sein soll (z.B. 
interne Datenstrukturen in denen der User nicht rumpfuschen soll).

In so einem Header könntest du sowas theoretisch unterbringen.
Wichtig: diesen Header nicht im public-Header inkludieren.

von PittyJ (Gast)


Lesenswert?

Ich nehme C++ für so etwas. Die Hilfsfunktionen sind dann private 
Funktionen.
Die kann man auch in extra Dateien packen. Es steht ja die Klasse davor.

von B. S. (bestucki)


Lesenswert?

Walter T. schrieb:
> Wie geht ihr bei dieser Klasse von Funktionen vor?

Funktionen die nur von einer Sourcedatei benötigt werden in die 
entsprechende Sourcedatei, alles andere klassisch mit Source- und 
Headerdateien (die auch privat, also modulintern, sein können). Dabei 
deklariere ich Funktionen, so klein sie auch sein mögen, nie als inline, 
bis ein Profiler mir dessen Notwendigkeit beweist. Ich mag es, wenn 
Deklaration und Definition strikt voneinander getrennt sind, aber das 
ist Geschmacksache.

von 1970 wants you back (Gast)


Lesenswert?

Es ist 2019, nicht 1970.
Kompilier das mit -lto und das wird auch über Übersetzungseinheiten 
hinweg optimiert.
Nachteilig ist die längere Kompilierzeit.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.