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

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