[C] Programm um Header und Source Dateien abzugleichen

OP
Ja, das ist der Ist-Zustand ;)

Ich brödel oft Bibliotheken zusammen bei denen ich nicht sofort alles 
benutze- da fällt so ein Fehler zwischen Deklaration und Definition dann 
auch erst später auf und beherbergt ein Überraschungsmoment ;)
Gast
Irgendwo zwischen den Aufrufparametern zu Deinem Compiler, versteckt 
sich einer, bei dem der Quelltext durchforstet wird und die 
Funktionsprototypen ausspuckt werden.
Gast
Heiko L. schrieb:
> Gibt es ein Programm (oder Eclipse Plugin) das man mit einer .c und
> einer .h Datei füttern kann um Deklaration und Definition abzugleichen

Abzugleichen vielleicht nicht, aber wenn man sich diszipliniert
und *.h Dateien unterscheidet in auto-generated und self-generated
dann mag z.B. so etwas helfen:

http://www.hwaci.com/sw/mkhdr/

Wir haben in unserer Firma unser eigenes Header-Generator-Tool,
das aber leider nicht öffentlich ist ....
Moderator Persönliche Seite
Heiko L. schrieb:
> Ich brödel oft Bibliotheken zusammen bei denen ich nicht sofort alles
> benutze- da fällt so ein Fehler zwischen Deklaration und Definition dann
> auch erst später auf und beherbergt ein Überraschungsmoment ;)

Verstehe ich nicht.

Wenn Du die h-Datei mit den Deklarationen auch in der C-Datei 
includierst, welche die Funktionen oder Variablen definiert, dann 
findet der Compiler auch die Missstände, die normalerweise vielleicht 
nicht auffallen, weil Du die Funktion X gar nicht aufrufst.

Es hängt also nicht davon ab, ob Du eine Funktion nutzt oder nicht.
OP
Frank M. schrieb:
> Wenn Du die h-Datei mit den Deklarationen auch in der C-Datei
> includierst, welche die Funktionen oder Variablen definiert,

Ehrlich gesagt mache ich das nur wenn es nicht anders geht, aber schaden 
kann es ja eigentlich nicht.

Aber der compiler (hier avr-gcc) meckert z.B. nicht über nicht 
definierte Deklarationen. Auch sehe ich keine Fehlermeldungen zu nicht 
deklarierten Definitionen (das wäre ja auch ziemlich unlogisch).

Man würde dann aber schon merken wenn Datentypen oder Parameter nicht 
passen.

Danke!

Der Makefile-Generator sieht auch interessant aus ;)
Gast
Heiko L. schrieb:
> Aber der compiler (hier avr-gcc) meckert z.B. nicht über nicht
> definierte Deklarationen. Auch sehe ich keine Fehlermeldungen zu nicht
> deklarierten Definitionen (das wäre ja auch ziemlich unlogisch).

dann brauchst du sie auch nicht in der Headerdatei. Die Headerdatei ist 
ja nur die schnitstelle wenn du die Funktion in mehre C files verwenden 
musst. Wenn sie nur ein einer C Datei gebraucht werden muss man sie 
nicht ins headfile schreiben.
Moderator Persönliche Seite
Heiko L. schrieb:
> Ehrlich gesagt mache ich das nur wenn es nicht anders geht,

Das muss immer gehen. Und man sollte es auch immer machen - und zwar 
als erstest. Wenn das (aus welchen Gründen auch immer) nicht geht, dann 
hast Du einen Designfehler im Programm.

> aber schaden kann es ja eigentlich nicht

Ganz im Gegenteil. Es zeigt sofort die Fehler bzgl. des Interfaces, noch 
bevor Du die Funktionen überhaupt nutzt.
Heiko L. schrieb:
> Ja, das ist der Ist-Zustand ;)
>
> Ich brödel oft Bibliotheken zusammen bei denen ich nicht sofort alles
> benutze- da fällt so ein Fehler zwischen Deklaration und Definition dann
> auch erst später auf und beherbergt ein Überraschungsmoment ;)

Hä?
WIe das?

WEnn jedes C-File aus deiner Bibliothek sein eigenes Header File 
inkludiert, dann fällt eine eventuelle Abweichung SOFORT auf, weil die 
Bibliothek dann schon gar nicht mehr durchcompiliert!

Daher: Jedes C-File inkludiert IMMER auch das Header File, in dem die 
Protoypen der von diesem C-File exportierten Funktionen drinn sind.
Das nicht zu tun, wäre allerdings wirklich grob fahrlässig.
Genauso wie so etwas

bar.c:
1
#include <stdio.h>
2
#include "xyz.h"
3

4
extern foo( int a );   // sollte eigentlich in xyz.h drinnen sein
5

6
void bar()
7
{
8
  foo( 5 );
9
}

Wenn du so eine unmotivierte extern Funktionsdeklaration in einem Source 
Code File siehst, dann druckst du das C-File aus, und drischt es dem 
Autor solange um die Ohren, bis nur noch Konfetti vorhanden ist.
Syntaktisch ist das legal. Aber nicht alles was syntaktisch legal ist, 
ist auch programmiertechnisch sinnvoll.
Beides zusammen, nicht inkludieren und unmotivierte 'extern' 
Deklarationen sind ungefähr vergleichbar damit, dass du Sebastian Vettel 
vorschlägst den nächsten Grand Prix ohne Sicherheitsgurt zu fahren. Man 
kann es probieren, aber er wird dir einen Vogel zeigen.
Heiko L. schrieb:
> Ich benutze -Wall, sollte also drin sein.

"sollte" sollte vielleicht so sein, ist es aber nicht. Der Begriff "all" 
in -Wall ist nicht wörtlich zu nehmen. Zum einen wäre ja sonst -Wextra 
überflüssig, zum anderen wären die vom Johann gennannten Warnungen nicht 
mal damit aktiviert.

Da hilft nix ausser RTFM.

Oliver
Persönliche Seite
Mark B. schrieb:
> Johann L. schrieb:
>> Heiko L. schrieb:
>>> Ich benutze -Wall, sollte also drin sein.
>>
>> Nein. -Wall sind nicht alle Warnungen!
>
> Dann sollte man hierfür vielleicht mal einen vernünftigen Namen
> vergeben. ;-)
>
> z.B. -Wusual oder -Wstandard

Zu allererst kann man mal die Doku lesen und verstehen, was man da 
aktiviert oder nicht:
1
Note that some warning flags are not implied by -Wall.
2
Some of them warn about constructions that users generally do not
3
consider questionable, but which occasionally you might wish to
4
check for; others warn about constructions that are necessary or
5
hard to avoid in some cases, and there is no simple way to modify
6
the code to suppress the warning. Some of them are enabled by
7
-Wextra but many of them must be enabled individually.
Persönliche Seite
Mark B. schrieb:
> Johann L. schrieb:
>> Zu allererst kann man mal die Doku lesen und verstehen, was man da
>> aktiviert oder nicht:
>
> Das ändert nichts daran, dass die Bezeichung "all" ungeschickt gewählt
> ist. Man darf Dinge ruhig sinnvoll benennen.

Na es zwingt ja niemand, Sammeloptionen wie -W, -Wall, -Os, -O2, 
-Wextra, -ffast-math etc. zu verwenden.

Die GCC-Entwickler sind bestrebt, solche Optionen halbwegs kompatibel zu 
halten und nicht von Version zu Version mit geänderten Suboptionen à la 
surprise aufzuwarten.

Außerdem war -Wall noch nie die Sammlung aller Warnungen.  Guckst du 
z.B. GCC 2.95 (Release 1999) 
https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_2.html#SEC8

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.