Compila il codice C in questo modo:
gcc -c -o somecode.o somecode.c
Poi il codice C++ come questo:
g++ -c -o othercode.o othercode.cpp
Quindi collegali insieme, con il linker C++:
g++ -o yourprogram somecode.o othercode.o
Devi anche dire al compilatore C++ che sta arrivando un'intestazione C quando includi la dichiarazione per la funzione C. Quindi othercode.cpp
inizia con:
extern "C" {
#include "somecode.h"
}
somecode.h
dovrebbe contenere qualcosa come:
#ifndef SOMECODE_H_
#define SOMECODE_H_
void foo();
#endif
(Ho usato gcc in questo esempio, ma il principio è lo stesso per qualsiasi compilatore. Compila separatamente come C e C++, rispettivamente, quindi collegalo insieme.)
Consentitemi di raccogliere i frammenti dalle altre risposte e commenti, per darvi un esempio con codice C e C++ nettamente separati:
La parte C:
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
void foo(void)
{
/* ... */
}
Compilalo con gcc -c -o foo.o foo.c
.
La parte C++:
bar.cpp
extern "C" {
#include "foo.h" //a C header, so wrap it in extern "C"
}
void bar() {
foo();
}
Compilalo con g++ -c -o bar.o bar.cpp
E poi collega tutto insieme:
g++ -o myfoobar foo.o bar.o
Motivazione: Il codice C dovrebbe essere semplice codice C, senza #ifdef
s per "forse un giorno lo chiamerò da un'altra lingua". Se qualche programmatore C++ chiama le tue funzioni C, è loro problema come farlo, non il tuo. E se sei il programmatore C++, allora l'intestazione C potrebbe non essere tua e non dovresti cambiarla, quindi la gestione dei nomi di funzione non modificati (cioè il extern "C"
) appartiene al tuo codice C++.
Potresti, ovviamente, scrivere tu stesso un comodo header C++ che non fa altro che avvolgere l'header C in un extern "C"
dichiarazione.