mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik header in header


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich möchte für ein AVR-Projekt eine zentrale header-Datei anlegen, in 
der alle notwendigen includes vorgenommen werden.
(Bsp.: "sleep.h", "stdint.h", "avr/io.h"....)
Dieser Header soll dann in alle Module eingebunden werden.

Wiederspricht irgendetwas dieser Praxis? Ich meine mich daran zu 
erinnern dass man das net machen soll...
...weiss aber nichtmehr warum.

Kann mir da jemand helfen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Hallo.
>
> Ich möchte für ein AVR-Projekt eine zentrale header-Datei anlegen, in
> der alle notwendigen includes vorgenommen werden.
> (Bsp.: "sleep.h", "stdint.h", "avr/io.h"....)
> Dieser Header soll dann in alle Module eingebunden werden.
>
> Wiederspricht irgendetwas dieser Praxis?

Das ist die Rundumschlagmethode

> Ich meine mich daran zu
> erinnern dass man das net machen soll...


Auf einem AVR ist es höchst wahrscheinlich egal, weil du nicht mehr als 
sagen wir mal 6 bis maximal 10 Header haben wirst. D.h. von der 
Compiliergeschwindigkeit spielt das kaum eine Rolle

> ...weiss aber nichtmehr warum.

Weil es dem halben Mechanismus des getrennten Compilierens einzelner *.c 
Files konträr läuft. De Facto hast du damit in allen *.c Files alle 
Header includiert, ob du sie im jeweiligen File brauchst oder nicht. Bei 
einer Änderung in einem einzigen Header File wird dir Make daher alle 
*.c Files nachcompilieren. Und das ist dann, wenn Projekte größer werden 
(>100 Files) nicht mehr Sinn der Sache.

Aber: wozu soll das gut sein?
Die 5 bis 6 Header, die man auf einm AVR in einem *.c File includiert, 
hat man doch auch zu Fuss in unter 30 Sekunden hingeschrieben. Meistens 
ist es so, dass solche Ideen von Programmierern kommen, die den 
Überblick verloren haben und daher einfach einen Rundumschlag machen, in 
der Hoffnung, dass sich dann alles von selbst erledigt.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Überblick verloren haben und daher einfach einen Rundumschlag machen, in
> der Hoffnung, dass sich dann alles von selbst erledigt
Spätestens dann ist das Projekt doch auch erledigt ;P

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Die 5 bis 6 Header, die man auf einm AVR in einem *.c File includiert,
> hat man doch auch zu Fuss in unter 30 Sekunden hingeschrieben.


Das stimmt. ABER:

Ich habe in der Header-Datei eigene Datentypen definiert, die ich in 
jedem .c File brauche (typedef unsigned char UC; ....).
Hier bleibt mir ja tatsächlich keine andere Wahl als den <stdint.h> 
-Header in meinen globalen-Header zu includieren, oder?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Ich habe in der Header-Datei eigene Datentypen definiert, die ich in
> jedem .c File brauche (typedef unsigned char UC; ....).

Gewöhn Dir das einfach gleich wieder ab. Wozu wohl gibt es die 
Datentypen in stdint.h, wozu sind uint8_t und Konsorten eingeführt 
worden?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:

> Ich habe in der Header-Datei eigene Datentypen definiert, die ich in
> jedem .c File brauche (typedef unsigned char UC; ....).

schlecht.
Es gibt dafür Standardtypen

> Hier bleibt mir ja tatsächlich keine andere Wahl als den <stdint.h>
> -Header in meinen globalen-Header zu includieren, oder?

Erfahrungsgemäss ist es so, dass Header in Header welcher seinerseits 
wieder einen Header includiert, der ...
zu schwer zu durchschauenden Abhängigkeiten führt. Du includierst dann 
in gutem Glauben einen Header in deinem *.c File und plötzlich prodziert 
der 'Error-Generator des Compilers' nur noch Errors. Es ist dann gar 
nicht mehr so einfach das Geflecht aus includes wieder 
auseinanderzunehmen um festzustellen welche Header Reihenfolge die 
richtige gewesen wäre.


Wenn ein Header File etwas benutzt, was in einem anderen Header 
definiert wird, dann ist es ok (und soll auch so sein), dass dieses *.h 
File den anderen Header inkludiert. Aber solche Rundumschlagmethoden 
machen oftmals mehr Ärger als sie bringen.

Denn es kommt noch hinzu: Das alles braucht doch keine Zeit beim 
Code-Schreiben. Du sitzt viele Stunden an einem Code-Projekt bis es 
fertig ist. Die 30 Sekunden, die du pro *.c File brauchst um dort alle 
Header zu includen die notwendig sind, die sind nicht der große 
Zeitbringer um ein Projekt schneller fertig zu bekommen :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.