Forum: Mikrocontroller und Digitale Elektronik AVR und C++


von AntonWert (Gast)


Lesenswert?

Wollte eben im neuen AVR Studio mit GCC eine C++ Klasse erzeugen, aber
leider will der Copmiler das nun nicht mehr schlucken.

in meinem header-file steht folgendes:

class test
{
public:
 void tueWas(void);

private:
 int nix;
}

leider Stoppt der Compilierforgang schon beim Wort "test"

von Mike R. (thesealion)


Lesenswert?

Vielleicht, weil der gcc ein C und kein c++ Compiler ist?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nö, gccavr ist auch ein C++-Compiler.
Ob nun als C oder C++ übersetzt wird, hängt von der
Dateinamenserweiterung der übersetzten Module ab (*.c -> C, *.cpp ->
C++ und -unter Windows sehr eigenwillig- *.C -> C++).

Allerdings wird der Compiler nicht einfach so den Compiliervorgang
beenden, sondern dazu auch noch irgendwas Informatives beitragen.

von AntonWert (Gast)


Lesenswert?

ja klar, er sagt mir die Zeilennummer und dann "error: parse error
before "test""

von ope (Gast)


Lesenswert?

wenn Du hinter class test { .. } auch das Semikolon setzt, klappt es
zumindest beim x86 g++ compiler.

Wenn ich mich recht erinnere, hat avr-gcc auch den g++ build -
inwiefern es nützlich ist mit kastrierten C++ zu arbeiten, ist
Ansichtssache.

Gegenüber C mit OO Design bleibt imo als Vorteil nur CTor/DTor übrig,
kein RTTI, keine exceptions etc.  Evtl. noch so kleine Schmankerln wie
for(unsigned i = 0; i != END; ++i) {}, was Du aber auch mit der cmd
line --std=gnu99 in C scharf machen kannst.

Viele Grüße
Olaf

von AntonWert (Gast)


Lesenswert?

ok, dann mal die andere Frage:

wie erzeuge ich nun eine Klasse in C? ..oder steh ich nun so auf dem
schlauch dass das auf meinem AVR garnicht geht?

von A.K. (Gast)


Lesenswert?

Vorteile z.B.:
- Encapsulation.
- Vereinheitlichte Schnittstellen verschiedener I/O gleicher Art,
z.B.digitale und analoge Temperatursensoren im gleichen Gerät.

von Rolf Magnus (Gast)


Lesenswert?

> Gegenüber C mit OO Design bleibt imo als Vorteil nur CTor/DTor
> übrig, kein RTTI, keine exceptions etc.

Was ist mit Templates und Operator-Überladung?

@Rufus:
> Ob nun als C oder C++ übersetzt wird, hängt von der
> Dateinamenserweiterung der übersetzten Module ab (*.c -> C, *.cpp
> -> C++ und -unter Windows sehr eigenwillig- *.C -> C++).

Es ist aber immer besser, g++ für C++-Code zu verwenden statt gcc. Beim
Compilieren ist gcc noch ok, aber beim Linken muß es dann doch g++ sein.
Und schon wegen der Konsostenz nimmt man am besten für beides g++.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wie heisst denn die Datei, die diese Headerdatei #includiert?

Im übrigen fehlt ein Semikolon - hinter die schließende geschweifte
Klammer gehört eines.

von AntonWert (Gast)


Lesenswert?

#include "file.h"

... und der Fehler mit dem Semikolon ist inzwischen behoben

von ope (Gast)


Lesenswert?

wow, das geht ab hier ;-)

Nun gut, ein paar Vorteile hat es noch, wie ihr gerade schriebt. Es
erinnert mich aber auch etwas an die Situation von vor einigen Jahren,
C++ im linux kernel machen zu wollen. Irgenwann war meine kleine lib
fertig, die fehlenden symbole wurden gelöst; aber letzlich eckte ich
dann doch immer wieder an den Begrenzungen dort an. Der Grund war u.a.
Idiome, STL ..., wie man sie auch von der x86 und 32bit OS
Programmierung her kennt. Eigentlich will man ja sein (damals
Echtzeit-) Problem im Kernel mit C++ lösen und nicht die komplett STL,
RTTI, EH etc. portieren .... Mit einem Subset kann man leben - ich
selber würde wohl beim AVR/C++ wieder auf dem Bauch landen.

Viele Grüße
Olaf

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Auf meine Frage

> Wie heisst denn die Datei, die diese Headerdatei #includiert?

mit

> #include "file.h"

zu antworten, ist nicht wirklich sinnvoll, nicht wahr?

von AntonWert (Gast)


Lesenswert?

oh sorry, hab zu schnell gelesen, die datei in der die Inlucde Anweisung
steht ist meine Main.c

Nicht zu vergessen ist ja hier, dass das ganze ein Projekt mir dem AVR
Studio ist, welches keine cpp Files zulässt (also mit WinAVR
untestützung, klar)

von OldBug (Gast)


Lesenswert?

Dateiendung '.c' sagt dem Compiler, daß es sich um C-Code handelt.
C unterstützt bekanntlich keine Klassen...

von AntonWert (Gast)


Lesenswert?

also um das ganze nun zusammenzufassen:

AVR GCC in verbindung mit AVR Studio laesst keine CPP Dateien zu, die
sind aber unbedingt notwendig fuer Klassen, folglich keine Klassen!

von Unbekannter (Gast)


Lesenswert?

Verwende anstatt dem Befehl "gcc" einfach "c++" oder "g++".

von OldBug (Gast)


Lesenswert?

Das versteh ich jetzt wierum nicht: was bedeutet avr-gcc lässt keine CPP
Dateien in Verbindung mit AVR Studio zu?

Wo hängt es denn da? Am Studio? Oder nur an der Endung .cpp?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> oh sorry, hab zu schnell gelesen, die datei in der die
> Inlucde Anweisung steht ist meine Main.c

Und genau dieser Name ist das Problem.

Die Datei muss mit *.cpp enden, sonst wird's nichts mit C++.

von Ulli (Gast)


Lesenswert?

C++ mit AVRStudio funktioniert,... allerdings nur mit umwegen. Und zwar
kannst du nicht das automatisch vom AVRStudio generierte MakeFile
benutzen sondern musst ein externes C++ "kompatibles" MakeFile
angeben. Das geht unter "project->Configuration Options".

von Ulli (Gast)


Lesenswert?

... ach ja nochwas, die Datei muss trotzdem mit *.cpp enden.
Viel Spaß

von Rolf Magnus (Gast)


Lesenswert?

Wenn man g++ (oder gcc -x c++) verwendet, geht's zur Not auch mit
anderen Endungen.

von ope (Gast)


Lesenswert?

wenn ich mir die Tortour so anschaue, wäre autoconf && automake unter
cygwin (k)eine Alternative?

von Ingo (Gast)


Lesenswert?

Also ich gehe so vor:

Im AVRStudio (4) alles (Projekt, .c, .h Dateien) ganz normal anlegen.
Dann ein Makefile exportieren. In den Projektoptionen "Use External
Makefile" anklicken und das eben exportierte Makefile anwählen. Im
Makefile dann noch avr-gcc durch avr-g++ ersetzen und die "../" vor
den .c Dateien ersetzen.

Um den Code klein zu halten wähle ich -O2 als Optimierungslevel.
Debuggen geht damit immer noch (ja man kann dann den C++ Code im AVR
Studio 4 debuggen)

von Gernot (Gast)


Lesenswert?

Kann mir bitte jemand sagen durch was man das "../" ersetzen muss?

Ich hab probiert es ersatzlos zu streichen was leider nicht das 
gewünschte Resultat brachte (wie vermutet). Der Compiler konnte zwar 
kompilieren, aber nur als C Code, Klassen usw erkannte er nicht.

Hoffe ihr könnt mir helfen.

mfg

Gernot

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.