Kompilieren Sie den C-Code wie folgt:
gcc -c -o somecode.o somecode.c
Dann der C++-Code wie folgt:
g++ -c -o othercode.o othercode.cpp
Verbinden Sie sie dann mit dem C++-Linker:
g++ -o yourprogram somecode.o othercode.o
Sie müssen dem C++-Compiler auch mitteilen, dass ein C-Header kommt, wenn Sie die Deklaration für die C-Funktion einschließen. Also othercode.cpp
beginnt mit:
extern "C" {
#include "somecode.h"
}
somecode.h
sollte so etwas wie:
#ifndef SOMECODE_H_
#define SOMECODE_H_
void foo();
#endif
(Ich habe in diesem Beispiel gcc verwendet, aber das Prinzip ist für jeden Compiler gleich. Erstellen Sie separat als C bzw. C++ und verknüpfen Sie es dann miteinander.)
Lassen Sie mich die Bits und Stücke aus den anderen Antworten und Kommentaren zusammentragen, um Ihnen ein Beispiel mit sauber getrenntem C- und C++-Code zu geben:
Der C-Teil:
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
void foo(void)
{
/* ... */
}
Kompilieren Sie dies mit gcc -c -o foo.o foo.c
.
Der C++-Teil:
bar.cpp
extern "C" {
#include "foo.h" //a C header, so wrap it in extern "C"
}
void bar() {
foo();
}
Kompilieren Sie dies mit g++ -c -o bar.o bar.cpp
Und dann alles miteinander verknüpfen:
g++ -o myfoobar foo.o bar.o
Begründung: Der C-Code sollte einfacher C-Code sein, kein #ifdef
s für "Vielleicht werde ich das eines Tages von einer anderen Sprache aus anrufen". Wenn ein C++-Programmierer Ihre C-Funktionen aufruft, sind es ihre Problem, wie man das macht, nicht deins. Und wenn Sie der C++-Programmierer sind, dann gehört der C-Header möglicherweise nicht Ihnen und Sie sollten ihn nicht ändern, sodass die Behandlung von unverfälschten Funktionsnamen (d. h. der extern "C"
) gehört in Ihren C++-Code.
Sie könnten sich natürlich einen bequemen C++-Header schreiben, der nichts anderes tut, als den C-Header in einen extern "C"
zu packen Erklärung.