Forum: Compiler & IDEs #include wird ignoriert


von KaWe (Gast)


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?

von Simon K. (simon) Benutzerseite


Lesenswert?

Poste halt die Headerdateien.

von damdam (Gast)


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

von Stefan E. (sternst)


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.

von Random .. (thorstendb) Benutzerseite


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:
1
#ifndef __HEADERFILENAME_H__
2
#define __HEADERFILENAME_H__
3
...
4
#endif
So kommt man nie in Konflikte.


VG,
/th.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von ... .. (docean) Benutzerseite


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...

von Karl H. (kbuchegg)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von KaWe (Gast)


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 ...

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
Noch kein Account? Hier anmelden.