C/C++ Kompilieren

Gast #3167989
Lesenswert?
• ▲
▼
Guten Tag!

Ich verzweifle seit einem ganzen Tag an folgender Situation:

Ich habe ein lauffähiges C-Programm und muss für weitere 
Softwareentwicklung eine Library einfügen, welche in C++ geschrieben 
ist. Zu Testzwecken habe ich ein kleines main geschrieben:
1
#include <test_cpp.h>
2

3
int main(void){
4
  
5
  int result = TEST::number;   
6

7
}

dazu die "Library" test_cpp.h:
1
#ifdef __cplusplus
2

3
namespace TEST {
4
  
5
  int number = 4;
6
  
7
}
8

9
#endif

Ich möchte vom main in eine namespace zugreifen. Leider funktioniert das 
nicht, der Compiler antwortet mit:

main.c #error: identifier TEST is undefined
main.c #error: expected a ";"      <-- für Zeile int result = 
TEST::number;

Um jede Hilfe bin ich dankbar!
Gast #3168003
Lesenswert?
• ▲
▼
Jim, danke für die prompte Antwort.

Diesen Versuch habe ich bereits vorgenommen. Die Umbenennung in .cpp 
bringt jedoch nichts, auch nicht wenn das Header file in .cpp benennt 
wird.

Lasse ich "#ifdef __cplusplus" weg, kennt der Compiler nicht mal das 
Schlüsselwort "namespace".

Was mache ich falsch?
#3168005
Lesenswert?
• ▲
▼
Andreas schrieb:
> Jim, danke für die prompte Antwort.
>
> Diesen Versuch habe ich bereits vorgenommen. Die Umbenennung in .cpp
> bringt jedoch nichts, auch nicht wenn das Header file in .cpp benennt
> wird.
>
> Lasse ich "#ifdef __cplusplus" weg, kennt der Compiler nicht mal das
> Schlüsselwort "namespace".
>
> Was mache ich falsch?

Du compilierst als C-Code und nicht als C++ Code.

wie sieht der Aufruf deines Compilers aus?
Gast #3168009
Lesenswert?
• ▲
▼
aber das bespiel macht auch überhaupt keinen sinn. In einer Header datei 
legt man keine Variabeln an und initalisert sie.

Wenn überhaupt dann muss sie als extern eingetragen werden. Wenn du die 
header datei in 2 verschienden .cpp dateien includierst hättest du 2 
veriabeln mit dem gleichen namen.
Gast #3168016
Lesenswert?
• ▲
▼
In den Compiler-Settings setze ich mit
--cpp und
--c99
die beiden Sprachen unter Misc Controls fest (MDK ARM C/C++ Compiler).

Der Compiler schluckt --cpp und reklamiert mit keiner warning/error. 
m.A. nach muss der Compiler das Schlüsselwort namespace verstehen.
#3168017
Lesenswert?
• ▲
▼
Andreas schrieb:

> Ich habe ein lauffähiges C-Programm und muss für weitere
> Softwareentwicklung eine Library einfügen, welche in C++ geschrieben
> ist.

Das geht nicht.
Du musst dein ganzes Projekt von C nach C++ umstellen. D.h. du musst 
deinen original C-Code durch den C++ Compiler schicken. Ist dein C-Code 
halbwegs sauber, dann geht das auch meistens ohne größere Probleme. Dann 
hast du ein C++ Programm (auch wenn es so aussieht, als wäre es C) und 
dann kannst du deine Library benutzen.
#3168022
Lesenswert?
• ▲
▼
Andreas schrieb:
> In den Compiler-Settings setze ich mit
> --cpp und
> --c99

nochmal.
Ab sofort hast du kein C-Programm mehr!

Dein komplettes Projekt ist ab sofort ein C++ Projekt.

> Der Compiler schluckt --cpp und reklamiert mit keiner warning/error.
> m.A. nach muss der Compiler das Schlüsselwort namespace verstehen.

Nicht, wenn du ihm das im Modus "C Code" unterjubelst.
#3168736
Lesenswert?
• ▲
▼
Andreas schrieb:
> ist. Zu Testzwecken habe ich ein kleines main geschrieben:
> #include <test_cpp.h>
>
> int main(void){
>
>   int result = TEST::number;

C kennt keine Namespaces, also kann die obige Zeile nicht funktionieren.

> }
> dazu die "Library" test_cpp.h:
> #ifdef __cplusplus

Die obige Zeile sagt, daß alles bis zum #endif von einem C-Compiler 
ignoriert werden soll.

> namespace TEST {
>
>   int number = 4;
>
> }
>
> #endif

Andreas schrieb:
> Jim, danke für die prompte Antwort.
>
> Diesen Versuch habe ich bereits vorgenommen. Die Umbenennung in .cpp
> bringt jedoch nichts, auch nicht wenn das Header file in .cpp benennt
> wird.

Warum nicht? Was passiert denn?

> Lasse ich "#ifdef __cplusplus" weg, kennt der Compiler nicht mal das
> Schlüsselwort "namespace".

Er kennt es auch so nicht. In C gibt es nunmal kein Schlüsselwort namens 
"namespace". Durch das #ifdef schmeißt der Präprozessor es halt raus, so 
daß der eigentliche Compiler es gar nicht mehr zu Gesicht bekommt.

Wenn du unbedingt C++-Code von C aus nutzen willst, lässt sich das nur 
über in C++ geschriebene Wrapper machen, die nach außen hin ein reines 
C-Interface anbieten. Je nach Umfang der Biblothek und des Programms 
kann es da einfacher sein, wie vorgeschlagen, dein ganzes C-Programm als 
C++ zu übersetzen, da C größtenteils ein Subset von C++ ist und sich 
meist mit nur wenigen Änderungen auch als C++ übersetzen läßt.
#3168901
Lesenswert?
• ▲
▼
@Andreas
Was für einen Compiler verwendest Du?

Dieses ist zwar die Rubrik GCC, d.h. aber noch lange nicht das es um den 
GCC geht. Man könnte unterstellen, dass Du mit einem reinen C-Compiler 
arbeitest. Dann sind alle Bemühungen diesem C++ unter zu jubeln nicht 
zielführend.

Grüsse

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.