No hay técnico diferencia. El compilador le dejará felizmente incluir un archivo .c
, o compilar un archivo .h
directamente, si así lo desea.
Hay, sin embargo, una gran diferencia culturales:
Declaraciones (prototipos) ir en .h
archivos. El archivo .h
es interfaz a lo que se implemente en el archivo correspondiente .c
.
Definiciones vaya en .c
archivos. Ellos implementan la interfaz especificada en el archivo .h
.
La diferencia es que un archivo .h
puede (y generalmente) ser #include
d en múltiples unidades de compilación (.c
archivos). Si define una función en un archivo .h
, terminará en múltiples archivos .o
, y el enlazador se quejará de un símbolo definido de forma múltiple. Es por eso que las definiciones no deben ir en los archivos .h
. (Las funciones en línea son la excepción.)
Si una función se define en un archivo .c
, y que desea utilizar de otras .c
archivos, una declaración de que la función tiene que estar disponible en cada uno de esos otros .c
archivos. Es por eso que pone la declaración en un .h
, y #include
que en cada uno de ellos. También podría repetir la declaración en cada archivo .c
, pero eso lleva a una gran cantidad de duplicación de código y un desorden inmaterial.
Si una función se define en un archivo .c
, pero No lo quieren usar de otras .c
archivos, no hay necesidad de declarar en la cabecera. Básicamente es un detalle de implementación de ese archivo .c
. En ese caso, configure la función static
también, para que no entre en conflicto con funciones idénticas en otros archivos.
Desafortunadamente, aunque el estándar no exige nada, la mayoría de los compiladores que he usado dependen en cierta medida de la extensión del archivo. Intente esto: cree dos archivos que contengan (digamos, 'int main() {return 0;}') llamados 'header.c' y' header.h' e intente compilarlos con gcc.(¡Ni siquiera me estoy acercando a VS!) – dirkgently
Sospecho que la mayoría de los programadores no ponen las declaraciones de funciones estáticas en el archivo .h. La principal diferencia entre .h y .c es entre la interfaz y la implementación. – Dipstick
@dirkgently: Bien, pero su compilador no actúa como un compilador de C si no obtiene la extensión de archivo correcta. El estándar no dice nada acerca de los programas que no son compiladores de C :) – Thomas