Tworzenie własnego pliku nagłówkowego w C

Odpowiedzi:

299

foo.h

#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);
    return 0;
}

Aby skompilować za pomocą GCC

gcc -o my_app main.c foo.c
Oliver Charlesworth
źródło
2
@Anu: Nie mogę tego przeczytać w tym formacie. Możesz edytować swoje oryginalne pytanie, aby uwzględnić ten kod.
Oliver Charlesworth
3
Warto zauważyć, że ten kod nie działa, jeśli spróbujesz go zbudować za pomocą przycisku (na przykład „buduj i uruchom” w Code :: Blocks). Może się to wydawać oczywiste dla ciebie, ale dla mnie to pierwszy raz i zajęło mi trochę czasu, zanim zrozumiałem, gdzie jest problem.
Jeyekomon
5
@Jeyekomon: Cóż, gdzie jest problem?
Oliver Charlesworth
2
Nikt mi nie powiedział, że przycisk „buduj i uruchom” nie wystarcza do wszystkiego. :-) To była dla mnie spora niespodzianka (jestem nowicjuszem). Teraz chyba muszę najpierw nauczyć się używać linii poleceń lub plików makefile.
Jeyekomon
1
Zastanawiałem się, czy mógłbyś wyjaśnić, jak skompilować wszystkie wymagane pliki i nie musisz dołączać foo.c do argumentu programu gcc. Jak nazywa się ta technika lub jaki program może to osiągnąć poza IDE - Przychodzi mi do głowy
Make
26
#ifndef MY_HEADER_H
# define MY_HEADER_H

//put your function headers here

#endif

MY_HEADER_H służy jako ochrona przed podwójnym włączeniem.

Do deklaracji funkcji wystarczy zdefiniować podpis, czyli bez nazw parametrów, na przykład:

int foo(char*);

Jeśli naprawdę chcesz, możesz również dołączyć identyfikator parametru, ale nie jest to konieczne, ponieważ identyfikator byłby używany tylko w treści funkcji (implementacji), której w przypadku nagłówka (sygnatura parametru) go brakuje.

To deklaruje funkcję, fooktóra akceptuje a char*i zwraca int.

W swoim pliku źródłowym miałbyś:

#include "my_header.h"

int foo(char* name) {
   //do stuff
   return 0;
}
Flavius
źródło
Są znane jako deklaracje funkcji lub prototypy funkcji , a nie „nagłówki funkcji”. Nagłówki to załączane pliki, a nie zawarte w nich deklaracje.
Jonathan Wakely,
@JonathanWakely To są pliki nagłówkowe. Nazwa mówi wszystko: pliki nagłówkowe zawierają nagłówki. Ale dzięki za informację zwrotną, to dało mi do myślenia.
Flavius
Nie, nagłówki to same pliki, a nie deklaracje, które zawierają. Czy możesz znaleźć jedno wiarygodne odniesienie do kopii zapasowej użycia „nagłówka”? Zaprzecza temu na przykład K&R, standard C, The UNIX Programming Environment i Wikipedia .
Jonathan Wakely
@JonathanWakely, czy czytałeś K&R? W spisie treści znajduje się sekcja „4.5 Pliki nagłówkowe”, a „Pliki nagłówkowe” są zapisane kursywą, wskazując terminologię. W pozostałej części książki autorzy czasami piszą tylko „nagłówek” dla zwięzłości, ale dzięki formatowaniu i spisowi treści jasne jest, jaka jest właściwa terminologia. Więc proszę, bądź profesjonalistą i rozpoznaj, kiedy się mylisz.
Flavius,
Tak, a „nagłówek” odnosi się do plików , a nie do zawartych w nich deklaracji. W drugim wydaniu patrz strona 241, gdzie omówiono standardowe nagłówki, oraz strona 33, która mówi o definicjach i deklaracjach (które omyłkowo nazywasz „nagłówkami funkcji”) i jasno definiuje nagłówek : „Zwykłą praktyką jest zbieranie externdeklaracji zmiennych i funkcje w oddzielnym pliku, historycznie nazywanym nagłówkiem , który jest dołączany #includena początku każdego pliku źródłowego. Funkcje biblioteki standardowej, na przykład, są deklarowane w nagłówkach, takich jak <stdio.h>. "
Jonathan Wakely
8

myfile.h

#ifndef _myfile_h
#define _myfile_h

void function();

#endif

myfile.c

#include "myfile.h"

void function() {

}
TommyGunn32
źródło
void function();jako deklaracja nie zapobiega wywołaniom typu function(42);. Użyj voidw deklaracji jakvoid function(void);
chux - Przywróć Monikę
5

Pliki nagłówkowe zawierają prototypy funkcji, które definiujesz w pliku .c lub .cpp / .cxx (w zależności od tego, czy używasz c czy c ++). Chcesz umieścić # ifndef / # definiuje wokół swojego kodu .h, więc jeśli umieścisz ten sam plik .h dwa razy w różnych częściach programów, prototypy zostaną uwzględnione tylko raz.

client.h

#ifndef CLIENT_H
#define CLIENT_H

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize);


#endif /** CLIENT_H */

Następnie zaimplementowałbyś .h w pliku .c w następujący sposób:

klient.c

#include "client.h"

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize) {
 short ret = -1;
 //some implementation here
 return ret;
}
djsumdog
źródło
"tak, że jeśli umieścisz ten sam plik .h dwa razy w różnych częściach programów, prototypy zostaną uwzględnione tylko raz." To jest mylące. Chronią przed włączeniem tego samego pliku nagłówkowego dwukrotnie z tego samego pliku źródłowego (w tym dwukrotne umieszczenie nagłówka w dwóch różnych plikach źródłowych jest w porządku i zwykle wymagane!), A ponowne zadeklarowanie prototypów funkcji nie stanowi problemu, ponowne zdefiniowanie typów i zmiennych globalnych jest tym, przed czym należy się wystrzegać.
Jonathan Wakely