#ifndef FOO_H_ /* Include guard */#define FOO_H_
int foo(int x);/* An example function declaration */#endif// FOO_H_
foo.c
#include"foo.h"/* Include the header (not strictly necessary here) */int foo(int x)/* Function definition */{return x +5;}
C Principal
#include<stdio.h>#include"foo.h"/* Include the header here, to obtain the function declaration */int main(void){int y = foo(3);/* Use the function here */
printf("%d\n", y);return0;}
@ Anu: No puedo leer eso en este formato. Puede editar su pregunta original para incluir este código.
Oliver Charlesworth
3
Vale la pena señalar que este código no funciona si intenta compilarlo simplemente por botón ("compilar y ejecutar" en Code :: Blocks, por ejemplo). Puede parecer obvio para usted, pero para mí es la primera vez que sucede y me llevó bastante tiempo descubrir dónde está el problema.
Jeyekomon
55
@Jeyekomon: Bueno, ¿dónde está el problema?
Oliver Charlesworth
2
Nadie me ha dicho que el botón "compilar y ejecutar" no es suficiente para todo. :-) Fue una gran sorpresa para mí (soy un novato). Ahora supongo que primero tengo que aprender a usar la línea de comandos o los archivos MAKE.
Jeyekomon
1
Me preguntaba si podría elaborar cómo compilar con todos los archivos necesarios y no tener que incluir foo.c en el argumento del programa gcc. ¿Qué es esta técnica llamada o qué programa puede lograr esto fuera del IDE - Make me viene a la mente
nf071590
26
#ifndef MY_HEADER_H
# define MY_HEADER_H//put your function headers here#endif
MY_HEADER_H sirve como guardia de doble inclusión.
Para la declaración de función, solo necesita definir la firma, es decir, sin nombres de parámetros, de esta manera:
int foo(char*);
Si realmente lo desea, también puede incluir el identificador del parámetro, pero no es necesario porque el identificador solo se usaría en el cuerpo de una función (implementación), que en el caso de un encabezado (firma del parámetro), falta.
Esto declara la función fooque acepta a char*y devuelve un int.
Se conocen como declaraciones de funciones o prototipos de funciones , no "encabezados de funciones". Los encabezados son los archivos que incluye, no las declaraciones dentro de ellos.
Jonathan Wakely
@ JonathanWakely Esos son los archivos de encabezado. El nombre lo dice todo: los archivos de encabezado contienen encabezados. Pero gracias por los comentarios, me hizo pensar por un segundo.
Flavius
No, los encabezados son los propios archivos, no las declaraciones que contienen. ¿Puedes encontrar una sola referencia confiable para respaldar tu uso del "encabezado"? K&R, el estándar C, The UNIX Programming Environment y Wikipedia , por ejemplo , lo contradicen .
Jonathan Wakely
@ Jonathan ¿En verdad has leído K&R? La tabla de contenido tiene una sección "4.5 Archivos de encabezado" y los "archivos de encabezado" están escritos en cursiva, lo que indica la terminología. En el resto del libro, los autores escriben a veces solo "encabezado" por brevedad, pero a través del formato y el TOC está claro cuál es la terminología correcta. Así que, por favor, sé un profesional y reconoce cuándo te equivocas
Flavius
Sí, y "encabezado" se refiere a los archivos , no a las declaraciones en ellos. En la 2da edición, vea la página 241 para la discusión de encabezados estándar, y la página 33 que habla sobre definiciones y declaraciones (que erróneamente llama "encabezados de función") y define claramente un encabezado : "La práctica habitual es recopilar externdeclaraciones de variables y funciones en un archivo separado, históricamente llamado encabezado , que se incluye #includeal frente de cada archivo fuente. Las funciones de la biblioteca estándar, por ejemplo, se declaran en encabezados como <stdio.h>".
void function();como una declaración no impide llamadas como function(42);. Usar voiden la declaración comovoid function(void);
chux - Restablecer Monica
5
Los archivos de encabezado contienen prototipos para las funciones que define en un archivo .c o .cpp / .cxx (dependiendo de si está utilizando c o c ++). Desea colocar # ifndef / # define alrededor de su código .h para que si incluye el mismo .h dos veces en diferentes partes de sus programas, los prototipos solo se incluyen una vez.
cliente.h
#ifndef CLIENT_H
#define CLIENT_H
short socketConnect(char*host,unsignedshort port,char*sendbuf,char*recievebuf,long rbufsize);#endif/** CLIENT_H */
Luego implementaría el .h en un archivo .c así:
cliente.c
#include"client.h"short socketConnect(char*host,unsignedshort port,char*sendbuf,char*recievebuf,long rbufsize){short ret =-1;//some implementation herereturn ret;}
"de modo que si incluye el mismo .h dos veces en diferentes partes de sus programas, los prototipos solo se incluyen una vez". Esto es engañoso. Protegen contra la inclusión del mismo archivo de encabezado dos veces desde el mismo archivo de origen (¡incluir un encabezado dos veces en dos archivos de origen diferentes está bien, y generalmente es obligatorio!) Y volver a declarar prototipos de funciones no es un problema, redefinir tipos y variables globales es contra lo que hay que protegerse.
Respuestas:
foo.h
foo.c
C Principal
Para compilar usando GCC
fuente
MY_HEADER_H
sirve como guardia de doble inclusión.Para la declaración de función, solo necesita definir la firma, es decir, sin nombres de parámetros, de esta manera:
Si realmente lo desea, también puede incluir el identificador del parámetro, pero no es necesario porque el identificador solo se usaría en el cuerpo de una función (implementación), que en el caso de un encabezado (firma del parámetro), falta.
Esto declara la función
foo
que acepta achar*
y devuelve unint
.En su archivo fuente, tendría:
fuente
extern
declaraciones de variables y funciones en un archivo separado, históricamente llamado encabezado , que se incluye#include
al frente de cada archivo fuente. Las funciones de la biblioteca estándar, por ejemplo, se declaran en encabezados como<stdio.h>
".myfile.h
myfile.c
fuente
void function();
como una declaración no impide llamadas comofunction(42);
. Usarvoid
en la declaración comovoid function(void);
Los archivos de encabezado contienen prototipos para las funciones que define en un archivo .c o .cpp / .cxx (dependiendo de si está utilizando c o c ++). Desea colocar # ifndef / # define alrededor de su código .h para que si incluye el mismo .h dos veces en diferentes partes de sus programas, los prototipos solo se incluyen una vez.
cliente.h
Luego implementaría el .h en un archivo .c así:
cliente.c
fuente