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?
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
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.
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:
1 | #ifndef __HEADERFILENAME_H__
|
2 | #define __HEADERFILENAME_H__
|
3 | ...
|
4 | #endif
|
So kommt man nie in Konflikte. VG, /th.
Random ... schrieb: > Ich nutze immer:
1 | #ifndef __HEADERFILENAME_H__ |
2 | #define __HEADERFILENAME_H__ |
3 | ... |
4 | #endif |
Bitte benutze stattdessen:
1 | #ifndef HEADERFILENAME_H__ |
2 | #define HEADERFILENAME_H__ |
3 | ... |
4 | #endif |
Bezeichner mit zwei führenden Unterstrichen sind der Benutzung durch den Compiler bzw. die Systembibliothek vorbehalten.
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...
... ... 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.
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):
1 | typedef struct _foo { |
2 | ...
|
3 | } foo; |
Im Prinzip kann man dann aber auch gleich schreiben:
1 | typedef struct foo { |
2 | ...
|
3 | } 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.
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 ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.