www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR und C++


Autor: AntonWert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Mike R. (thesealion)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht, weil der gcc ein C und kein c++ Compiler ist?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AntonWert (Gast)
Datum:

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

Autor: ope (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AntonWert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A.K. (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie heisst denn die Datei, die diese Headerdatei #includiert?

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

Autor: AntonWert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include "file.h"

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

Autor: ope (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: AntonWert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: OldBug (Gast)
Datum:

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

Autor: AntonWert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verwende anstatt dem Befehl "gcc" einfach "c++" oder "g++".

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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++.

Autor: Ulli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Ulli (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: ope (Gast)
Datum:

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

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Gernot (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.