Compile el código C así:
gcc -c -o somecode.o somecode.c
Entonces el código C++ así:
g++ -c -o othercode.o othercode.cpp
Luego conéctelos con el enlazador de C++:
g++ -o yourprogram somecode.o othercode.o
También tiene que decirle al compilador de C++ que viene un encabezado de C cuando incluye la declaración de la función de C. Así que othercode.cpp
comienza con:
extern "C" {
#include "somecode.h"
}
somecode.h
debe contener algo como:
#ifndef SOMECODE_H_
#define SOMECODE_H_
void foo();
#endif
(Usé gcc en este ejemplo, pero el principio es el mismo para cualquier compilador. Construya por separado como C y C++, respectivamente, luego conéctelo).
Permítanme recopilar los fragmentos de las otras respuestas y comentarios, para darles un ejemplo con código C y C++ claramente separados:
La parte C:
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
void foo(void)
{
/* ... */
}
Compile esto con gcc -c -o foo.o foo.c
.
La parte de C++:
bar.cpp
extern "C" {
#include "foo.h" //a C header, so wrap it in extern "C"
}
void bar() {
foo();
}
Compile esto con g++ -c -o bar.o bar.cpp
Y luego vincularlo todo:
g++ -o myfoobar foo.o bar.o
Justificación: El código C debe ser código C simple, sin #ifdef
s para "tal vez algún día llame a esto desde otro idioma". Si algún programador de C++ llama a sus funciones C, es su problema de cómo hacer eso, no el tuyo. Y si usted es el programador de C++, es posible que el encabezado de C no sea suyo y no debe cambiarlo, por lo que el manejo de los nombres de funciones no alterados (es decir, el extern "C"
) pertenece a su código C++.
Por supuesto, puede escribir un encabezado C++ conveniente que no haga nada más que envolver el encabezado C en un extern "C"
declaración.