Compilez le code C comme ceci :
gcc -c -o somecode.o somecode.c
Puis le code C++ comme ceci :
g++ -c -o othercode.o othercode.cpp
Ensuite, reliez-les ensemble, avec l'éditeur de liens C++ :
g++ -o yourprogram somecode.o othercode.o
Vous devez également indiquer au compilateur C++ qu'un en-tête C arrive lorsque vous incluez la déclaration de la fonction C. Donc othercode.cpp
commence par :
extern "C" {
#include "somecode.h"
}
somecode.h
doit contenir quelque chose comme :
#ifndef SOMECODE_H_
#define SOMECODE_H_
void foo();
#endif
(J'ai utilisé gcc dans cet exemple, mais le principe est le même pour n'importe quel compilateur. Construisez séparément en tant que C et C++, respectivement, puis liez-le ensemble.)
Permettez-moi de rassembler les éléments des autres réponses et commentaires, pour vous donner un exemple avec du code C et C++ proprement séparé :
La partie C :
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
void foo(void)
{
/* ... */
}
Compilez ceci avec gcc -c -o foo.o foo.c
.
La partie C++ :
bar.cpp
extern "C" {
#include "foo.h" //a C header, so wrap it in extern "C"
}
void bar() {
foo();
}
Compilez ceci avec g++ -c -o bar.o bar.cpp
Et puis reliez le tout :
g++ -o myfoobar foo.o bar.o
Justification : Le code C doit être du code C clair, pas de #ifdef
s pour "peut-être qu'un jour j'appellerai ça depuis une autre langue". Si un programmeur C++ appelle vos fonctions C, c'est leur problème comment faire cela, pas le vôtre. Et si vous êtes le programmeur C++, alors l'en-tête C n'est peut-être pas le vôtre et vous ne devriez pas le changer, donc la gestion des noms de fonction non mutilés (c'est-à-dire le extern "C"
) appartient à votre code C++.
Vous pouvez, bien sûr, écrire vous-même un en-tête C++ pratique qui ne fait rien d'autre que d'envelopper l'en-tête C dans un extern "C"
déclaration.