Forum: Compiler & IDEs C/C++ Kompilieren


von Andreas (Gast)


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!

von Jim M. (turboj)


Lesenswert?

> main.c #error: identifier TEST is undefined

Benenne die Datei in main.cpp um, dann wird sie i.d.R. korrekt mit dem 
C++ Compiler verarbeitet. Mit Endung ".c" wird nur der C-Compiler 
verwendet, den sperrst Du aber mit "#ifdef __cplusplus" aus.

von Andreas (Gast)


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?

von Karl H. (kbuchegg)


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?

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


Lesenswert?

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

Weil du offensichtlich versuchst, das als C zu compilieren.  C
kennt keine namespaces.

von Peter II (Gast)


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.

von Marwin (Gast)


Lesenswert?

Vielleicht sollte man Software von Software-Entwicklern entwickeln 
lassen. :-/

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> aber das bespiel macht auch überhaupt keinen sinn.

So wie ich das verstanden habe, geht es nur um einen Test, wie er den 
Compiler aufrufen muss, damit er C++ compilieren kann.

von Andreas (Gast)


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.

von Karl H. (kbuchegg)


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.

von Markus M. (mark_m)


Lesenswert?

Welche IDE und welchen Compiler verwendest Du?

Grüsse

von Karl H. (kbuchegg)


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.

von Rolf M. (rmagnus)


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.

von Markus M. (mark_m)


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

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.