mikrocontroller.net

Forum: Compiler & IDEs #include wird ignoriert


Autor: KaWe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe ein Problem mit einem c++-Projekt für Atmega644P. Mein Source 
besteht (derzeit) aus einer main.cpp und den Objekten serialout.cpp und 
sensor.cpp. Für alle 3 Dateien habe ich Header-Files angelegt und alles 
(meiner Meinung nach) richtig verknüpft.
Meine main.h sieht folgendermaßen aus:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "sensor.h"
#include "serialout.h"

Wenn ich das so compile, scheint er die serialout komplett zu ignorieren 
und ich bekommen beim instanziieren des in der serialout.h beschriebenen 
Objekts ein "does not name a type"-error. Tausche ich die Reihenfolge 
kommt der gleiche Error, allerdings auf das Objekt "Sensor" bezogen. 
Serialout compiliert dann einwandfrei. Woran könnte das liegen?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste halt die Headerdateien.

Autor: damdam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo KaWe,

hast du vielleicht einen Rekursion geschaffen aus versehen ? Z.b. in den 
beiden Headern wiederum den jeweils anderen eingebunden, so dass er in 
eine Schleife kommt, welche der Compiler aber bemerkt und dann das 
Includieren abbricht?

Alternativ kann ich mir auch vorstellen, dass du einfach irgendwo ein 
Zeichen drin hast, was er nicht will, so dass er nicht mehr weiter macht 
und im nächsten Abschnitt erst weiter schaut - es scheint ja ein Problem 
mit dem Präprozessor zu sein und nicht mit dem Compiler selbst...

gruß, damdam

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast nicht zufällig in beiden Headern einen Include-Guard mit dem 
gleichen Identifikator, oder? Z.B. weil per Copy&Paste erzeugt und dann 
vergessen den Identifikator zu ändern.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schreib einfach mal müll in den header, darüber sollte der cc stolpern.
Wenn nicht, gibt es ev. ein gleichnamiges #define irgendwo?

Ich nutze immer:
#ifndef __HEADERFILENAME_H__
#define __HEADERFILENAME_H__
...
#endif
So kommt man nie in Konflikte.


VG,
/th.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Random ... schrieb:
> Ich nutze immer:
#ifndef __HEADERFILENAME_H__
#define __HEADERFILENAME_H__
...
#endif

Bitte benutze stattdessen:
#ifndef HEADERFILENAME_H__
#define HEADERFILENAME_H__
...
#endif

Bezeichner mit zwei führenden Unterstrichen sind der Benutzung durch
den Compiler bzw. die Systembibliothek vorbehalten.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Bezeichner mit zwei führenden Unterstrichen sind der Benutzung durch
> den Compiler bzw. die Systembibliothek vorbehalten.

Ich kenn das das ein Unterstrich für Compiler/System ist, man selbst 
aber 2 Unterstriche verwenden sollte

ohne Unterstriche ist halt für normale defines...

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

Bewertung
0 lesenswert
nicht lesenswert
... ... schrieb:
> Jörg Wunsch schrieb:
>> Bezeichner mit zwei führenden Unterstrichen sind der Benutzung durch
>> den Compiler bzw. die Systembibliothek vorbehalten.
>
> Ich kenn das das ein Unterstrich für Compiler/System ist, man selbst
> aber 2 Unterstriche verwenden sollte

Die tatsächliche Regelung ist etwas komplizierter.

Es war irgendwas in der Richtung
* doppelte Unterstriche sind generell
* ein einzelner Untertrich nur mit einem nachfolgenden Grossbuchstaben
reserviert. (oder wars umgekehrt: doppelte mit nachfolgendem 
Grossbuchstaben?)

Da man sich diese Regeln nicht besonders gut merken kann (zumindest mir 
gehts so), ist das Einfachste: Hände weg vor 1 und 2 führenden 
Unterstrichen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Die tatsächliche Regelung ist etwas komplizierter.
>
> Es war irgendwas in der Richtung
> * doppelte Unterstriche sind generell
> * ein einzelner Untertrich nur mit einem nachfolgenden Grossbuchstaben
> reserviert. (oder wars umgekehrt: doppelte mit nachfolgendem
> Grossbuchstaben?)

So herum passt es einigermaßen, außer dass es insgesamt noch
kompliziertert ist, da manches noch zwischen dateiweitem Namensraum
bzw. anderen Namensräumen unterschieden wird.

> Da man sich diese Regeln nicht besonders gut merken kann (zumindest mir
> gehts so), ist das Einfachste: Hände weg vor 1 und 2 führenden
> Unterstrichen.

Die einzige Ausnahme, die man sich durchaus auch merken kann:
innerhalb von struct/union und meiner Erinnerung nach auch enum
ist ein einzelner Unterstrich gefolgt von einem Kleinbuchstaben OK.
Kann man benutzen bspw. für sowas (und manche Leute mögen das):
typedef struct _foo {
   ...
} foo;

Im Prinzip kann man dann aber auch gleich schreiben:
typedef struct foo {
   ...
} foo;

Zwar führt in C++ eine struct immer einen entsprechenden Namen auch
im umgebenden Namensraum (ohne vorangestelltes "struct") ein, aber
ich glaube mich zu erinnern, dass eine identische Doppeldefinition
des Namens sowohl als struct als auch als typedef dort explizit
zulässig ist.  Daher hat man mit dieser Variante die Möglichkeit, für
C und C++ gleich lautende Definitionen zu schreiben, deren Typname
dann hinterher als "foo" zugreifbar ist.

Autor: KaWe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

vielen Dank für die Tipps. Es war wirklich so, dass ich aus Versehen 
eine Rekursion geschaffen habe. Habe jetzt meine header mit ifndef und 
define wieder sauber durchstrukturiert.
Vielen Dank für den Tipp! Da sucht man sich nen Wolf und es ist 
tatsächlich bloß so ein Blödsinnsfehler ...

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.