Diferencias entre archivos .c y .cpp

Quisiera saber la diferencia entre un archivo con extensión .c y uno .cpp, pues leí que cuando en el archivo .h que genero a través de JNI se tiene un extern "C" tiene que ver con el compilador de C o algo así y quizás por ehi este la solución a mi problema al hacer link, pero como le digo soy nueva programando con C y a pesar de que mi trabajo original es en JAVA necesito hacer el wrapper de JNI en C pues los driver del scanner que deseo conectar están implementados en C

1 respuesta

Respuesta
1
Habitualmente la diferencia en la extensión (.cpp o .c), define el tipo de código que hay escrito.
Así si los fichero tienen extensión .cpp los compiladores compilaran su contenido de acuerdo a las gramática y sintaxis de C++, mientras que los archivos con extensión .c los compiladores usarán la de C.
La diferencia no solo se haya en que se use una gramática u otra, si no que además C++ cuando compila una función en el fichero .obj su nombre es alterado de una manera distinta a como lo hace C.
Te pongo un ejemplo.
Si en un fichero .cpp tu defines la siguiente función:
void MiFuncion(void *,unsigned long) la función en el fichero .obj tiene como nombre:
__imp_?MiFuncion@@YGXPAXK@Z.
Mientras que si tu declaras la misma función en un fichero con extensión .c, dicha función aparecerá en el fichero .obj como:
_MiFuncion
Resulta que los archivos de cabecera (los de extensión .h) se utilizan para declarar las funciones tanto para ficheros de C como de C++.
Así que si tu tienes en el fichero de cabecera la declaración de la función anterior, de la siguiente manera:
void MiFuncion(void *,unsigned long);
Si la función que has declarado en ese fichero MiFuncion. H se implementa por ejemplo en el fichero MiFuncion.cpp y se usa en el fichero Código.cpp
Cuando el linker las resuelva no vas a tener ningún problema.
Ambas están escritas en C++ y tendrán ese nombre raro, que por cierto se llama mangling.
Pero si en otro caso la función que has declarado en ese fichero MiFuncion. H se implementa por ejemplo en el fichero MiFuncion.c y se usa en el fichero Código.cpp
Cuando el linker las resuelva va a dar el siguiente error:
unresolved external symbol "__declspec(dllimport) void __stdcall __imp_?MiFuncion@@YGXPAXK@Z
Por que en el fichero Código. Obj la función a buscar va a buscar se llama así (__imp_?MiFuncion@@YGXPAXK@Z), mientras que la función que realmente existe en MiFunción.obj se llama _MiFuncion.
Para ello, se le indica en el fichero .cpp que dicha función no está generada con la regla de C++, si no con las reglas de C. Eso se hace con la directiva extern "C".
Y se pone en el fichero que se compila en C++ pero va a usar funciones escritas en C.
Lo que puede pasar, es que habitualmente las funciones escritas por los fabricantes de librerías, están casi siempre escritas en C. Con lo cual a la hora de usarlas se pueden usar tanto en C, como en C++.
En los ficheros y programas hechos en C++, se añade la directiva extern "C" de la siguiente manera:
extern "C"
{
#include "fichero.h"
}
Indicando que todas las funciones de ese fichero están escritas en C, y no se deben de buscar con la sintaxis de C++.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas