#include wird ignoriert

Gast #1671031
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?
Gast #1671039
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
#1671237
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.
Moderator Persönliche Seite #1671286
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):
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.
Gast #1671342
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren