#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;}
main.c
#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: Eu não consigo ler isso neste formato. Você pode editar sua pergunta original para incluir esse código.
Oliver Charlesworth
3
Vale a pena notar que esse código não funciona se você tentar compilá-lo por botão ("compilar e executar" no Code :: Blocks, por exemplo). Pode parecer óbvio para você, mas para mim é a primeira vez que isso acontece e levei algum tempo para descobrir onde está o problema.
Jeyekomon
5
@Jeyekomon: Bem, onde está o problema?
Oliver Charlesworth
2
Ninguém me disse que o botão "construir e executar" não é suficiente para tudo. :-) Foi uma surpresa para mim (eu sou um novato). Agora acho que tenho que aprender a usar a linha de comando ou os makefiles primeiro.
Jeyekomon
1
Eu queria saber se você poderia elaborar como compilar com todos os arquivos necessários e não precisar incluir foo.c no argumento do programa gcc. O que é esta técnica chamada ou o programa pode fazer isso fora do IDE - Marca vem à minha mente
nf071590
26
#ifndef MY_HEADER_H
# define MY_HEADER_H//put your function headers here#endif
MY_HEADER_H serve como um guarda de dupla inclusão.
Para a declaração da função, você só precisa definir a assinatura, ou seja, sem nomes de parâmetros, como este:
int foo(char*);
Se você realmente quiser, também pode incluir o identificador do parâmetro, mas não é necessário porque o identificador seria usado apenas no corpo de uma função (implementação), que, no caso de um cabeçalho (assinatura do parâmetro), está ausente.
Isso declara a função fooque aceita ae char*retorna uma int.
Eles são conhecidos como declarações ou protótipos de função , não "cabeçalhos de função". Cabeçalhos são os arquivos que você inclui, não as declarações dentro deles.
Jonathan Wakely
@ JonathanWakely Esses são os arquivos de cabeçalho. O nome diz tudo: os arquivos de cabeçalho contêm cabeçalhos. Mas obrigado pelo feedback, isso me fez pensar por um segundo.
Flavius
Não, os cabeçalhos são os próprios arquivos, não as declarações que eles contêm. Você consegue encontrar uma única referência respeitável para fazer backup do uso do "cabeçalho"? É contradito por K&R, o padrão C, o ambiente de programação UNIX e a Wikipedia , por exemplo.
Jonathan Wakely
@JonathanWakely você realmente leu K&R? O sumário contém uma seção "4.5 Arquivos de cabeçalho" e "Arquivos de cabeçalho" escritos em itálico, indicando terminologia. No restante do livro, os autores escrevem algumas vezes apenas "cabeçalho" por questões de concisão, mas, por meio da formatação e do sumário, fica claro qual é a terminologia correta. Então, por favor, seja um profissional e reconheça quando estiver errado.
Flavius
Sim, e "cabeçalho" refere-se aos arquivos , não às declarações neles. Na 2ª edição, consulte a página 241 para discussão dos cabeçalhos padrão e a página 33, que fala sobre definições e declarações (que você chama erroneamente de "cabeçalhos de função") e define claramente um cabeçalho : "A prática usual é coletar externdeclarações de variáveis e funções em um arquivo separado, historicamente chamado de cabeçalho , incluído #includena frente de cada arquivo de origem. As funções da biblioteca padrão, por exemplo, são declaradas em cabeçalhos como <stdio.h>".
void function();como uma declaração não impede chamadas como function(42);. Use voidna declaração comovoid function(void);
chux - Reinstate Monica
5
os arquivos de cabeçalho contêm protótipos para funções definidas em um arquivo .c ou .cpp / .cxx (dependendo se você estiver usando c ou c ++). Você deseja colocar # ifndef / # define em torno do seu código .h para que, se você incluir o mesmo .h duas vezes em diferentes partes dos seus programas, os protótipos sejam incluídos apenas uma vez.
client.h
#ifndef CLIENT_H
#define CLIENT_H
short socketConnect(char*host,unsignedshort port,char*sendbuf,char*recievebuf,long rbufsize);#endif/** CLIENT_H */
Em seguida, você implementaria o .h em um arquivo .c da seguinte forma:
client.c
#include"client.h"short socketConnect(char*host,unsignedshort port,char*sendbuf,char*recievebuf,long rbufsize){short ret =-1;//some implementation herereturn ret;}
"para que, se você incluir o mesmo .h duas vezes em diferentes partes dos seus programas, os protótipos sejam incluídos apenas uma vez." Isso é enganador. Eles se protegem contra a inclusão do mesmo arquivo de cabeçalho duas vezes do mesmo arquivo de origem (incluir um cabeçalho duas vezes em dois arquivos de origem diferentes é ok e geralmente é necessário!) E declarar novamente os protótipos de função não é um problema, redefinir tipos e variáveis globais é o que deve ser protegido.
Respostas:
foo.h
foo.c
main.c
Para compilar usando o GCC
fonte
MY_HEADER_H
serve como um guarda de dupla inclusão.Para a declaração da função, você só precisa definir a assinatura, ou seja, sem nomes de parâmetros, como este:
Se você realmente quiser, também pode incluir o identificador do parâmetro, mas não é necessário porque o identificador seria usado apenas no corpo de uma função (implementação), que, no caso de um cabeçalho (assinatura do parâmetro), está ausente.
Isso declara a função
foo
que aceita aechar*
retorna umaint
.No seu arquivo de origem, você teria:
fonte
extern
declarações de variáveis e funções em um arquivo separado, historicamente chamado de cabeçalho , incluído#include
na frente de cada arquivo de origem. As funções da biblioteca padrão, por exemplo, são declaradas em cabeçalhos como<stdio.h>
".myfile.h
myfile.c
fonte
void function();
como uma declaração não impede chamadas comofunction(42);
. Usevoid
na declaração comovoid function(void);
os arquivos de cabeçalho contêm protótipos para funções definidas em um arquivo .c ou .cpp / .cxx (dependendo se você estiver usando c ou c ++). Você deseja colocar # ifndef / # define em torno do seu código .h para que, se você incluir o mesmo .h duas vezes em diferentes partes dos seus programas, os protótipos sejam incluídos apenas uma vez.
client.h
Em seguida, você implementaria o .h em um arquivo .c da seguinte forma:
client.c
fonte