C-Code in C++-Lib-Projekt verwenden
-
Hey Leute,
ich bastel gerade an einem C++-Projekt (VS2010) zum Erstellen einer Lib.
Gerne würde ich zur Vereinfachung einiger Dinge C-Code verwenden.
Das Projekt ist primär auf C++-Basis erstellt.Ich habe 3 C++-Header mit entsprechenden .cpp-Dateien und 2 C-Header mit entsprechenden .c-Dateien.
Die C++-Dateien haben normalen C++-Code.
In den C-Headern verwende ich#ifdef __cplusplus extern "C" { ... C-Code ... } #endifNun nutze ich C-Code in der .c-Datei. Jedoch werden mir Fehler angezeigt, weil der Code offenbar nicht als C-Code kompiliert wird, sondern als C++-Code.
In den Eigenschaften der .c-Datei habe ich unter C/C++ => Erweitert => Kompilierungsart bereits auf "als C-Code kompilieren" umgestellt, aber es ändert sich leider nichts.Habt ihr eine Idee, woran es liegen könnte, dass ich den C-Code nicht kompiliert bekomme?
Vielen Dank!
-
Geht's etwas ausführlicher als "mir werden Fehler angezeigt"?
-
MediStef schrieb:
Die C++-Dateien haben normalen C++-Code.
In den C-Headern verwende ich#ifdef __cplusplus extern "C" { ... C-Code ... } #endifDas sollte wohl eher so aussehen:
#ifdef __cplusplus extern "C" { #endif ... C-Code ... #ifdef __cplusplus } #endifAnsonsten ist der C-Code auch nur vorhanden, wenn du C++ kompilierst.
-
Entschuldige, es sind Kompilierungsfehler, z. B.
_Bool readUnsignedShortInt(gzFile* f, int len, unsigned short int* value) { char buf[len+1]; . . . }Unter C sollte er z. B. len+1 akzeptieren, in C++ muss len+1 zum Zeitpunkt der Kompilierung einen konstanten und bekannten Wert haben.
Das zeigt mit, dass der Code fehlinterpretiert wird.
EDIT: @oenone, japp sieht auch so aus, habs falsch zusammengefasst. Danke.
-
Der C-Compiler von Visual C++ unterstützt keine VLAs.
-
Du kannst natürlich nur die Schnittmenge von C und C++ nehmen. C++ ist nicht 100% kompatibel zu C.
Edit:
Jepp, VLA sind C99 und der C-Compiler von Visual Studio ist nicht 100% C99-konform.Edit2:
Fun Fact: Die deutsche Auto-Übersetzung verdreht den Sinn: Aus "Variable length arrays are not currently supported in Visual C++." wird "Arrays mit variabler Länge werden nicht nur in Visual C++ unterstützt.":
http://msdn.microsoft.com/de-de/library/zb1574zs(v=vs.120).aspx
-
Oki, vielen Dank!
Ich dachte, wenn schon ein C-Compiler angeboten wird, dann unterstützt der auch vollständig.
Dann wird mein Workaround wohl jener sein:
_Bool readUnsignedShortInt(gzFile* f, int len, unsigned short int* value) { char *buf = new char [len+1]; . . . delete[] buf; }Ich danke euch.
-
MediStef schrieb:
Ich dachte, wenn schon ein C-Compiler angeboten wird, dann unterstützt der auch vollständig.
Microsoft hat wenig Liebe für C. Aber der C-Compiler unterstützt C auch "vollständig", wenn du von C89/C90 ausgehst (auch "ANSI C" genannt).
Wenn du Sprachfeatures von einer neueren Version nimmst, musst du auch einen Compiler suchen, der die unterstützt.
Es gibt denke ich keinen Compiler, der wirklich *alle* Standards vollständig unterstützt.
-
MediStef schrieb:
Dann wird mein Workaround wohl jener sein:
_Bool readUnsignedShortInt(gzFile* f, int len, unsigned short int* value) { char *buf = new char [len+1]; . . . delete[] buf; }Wohl eher
malloc()undfree(). Oder mit Vorsichtalloca().
-
Caligulaminus schrieb:
Wohl eher
malloc()undfree(). Oder mit Vorsichtalloca().Sind VLAs nicht einfach nur Syntaxzucker für alloca?
-
DrakoXP schrieb:
Caligulaminus schrieb:
Wohl eher
malloc()undfree(). Oder mit Vorsichtalloca().Sind VLAs nicht einfach nur Syntaxzucker für alloca?
Ich bin mir nicht ganz sicher, aber wahrscheinlich ist es dasselbe, ja.