Zkompilujte kód C takto:
gcc -c -o somecode.o somecode.c
Potom kód C++ takto:
g++ -c -o othercode.o othercode.cpp
Poté je propojte pomocí C++ linkeru:
g++ -o yourprogram somecode.o othercode.o
Musíte také sdělit kompilátoru C++, že přichází hlavička C, když zahrnete deklaraci pro funkci C. Takže othercode.cpp
začíná:
extern "C" {
#include "somecode.h"
}
somecode.h
by měl obsahovat něco jako:
#ifndef SOMECODE_H_
#define SOMECODE_H_
void foo();
#endif
(V tomto příkladu jsem použil gcc, ale princip je stejný pro jakýkoli kompilátor. Sestavte samostatně jako C a C++ a poté je propojte.)
Dovolte mi shromáždit kousky z ostatních odpovědí a komentářů, abych vám dal příklad s čistě odděleným kódem C a C++:
Část C:
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
void foo(void)
{
/* ... */
}
Zkompilujte to pomocí gcc -c -o foo.o foo.c
.
Část C++:
bar.cpp
extern "C" {
#include "foo.h" //a C header, so wrap it in extern "C"
}
void bar() {
foo();
}
Zkompilujte to pomocí g++ -c -o bar.o bar.cpp
A pak to všechno propojte:
g++ -o myfoobar foo.o bar.o
Odůvodnění: Kód C by měl být prostý kód C, žádný #ifdef
s pro "možná to někdy zavolám z jiného jazyka". Pokud nějaký C++ programátor volá vaše C funkce, je to jejich problém, jak to udělat, ne váš. A pokud jste programátor v C++, pak hlavička C nemusí být vaše a neměli byste ji měnit, takže zacházení s nezměněnými názvy funkcí (tj. extern "C"
) patří do vašeho kódu C++.
Můžete si samozřejmě napsat pohodlnou hlavičku C++, která nedělá nic jiného, než zabalí hlavičku C do extern "C"
prohlášení.