#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: 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.
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>. "
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,unsignedshort 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,unsignedshort port,char*sendbuf,char*recievebuf,long rbufsize){short ret =-1;//some implementation herereturn ret;}
"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ć.
Odpowiedzi:
foo.h
foo.c
main.c
Aby skompilować za pomocą GCC
źródło
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:
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ę,
foo
która akceptuje achar*
i zwracaint
.W swoim pliku źródłowym miałbyś:
źródło
extern
deklaracji zmiennych i funkcje w oddzielnym pliku, historycznie nazywanym nagłówkiem , który jest dołączany#include
na początku każdego pliku źródłowego. Funkcje biblioteki standardowej, na przykład, są deklarowane w nagłówkach, takich jak<stdio.h>
. "myfile.h
myfile.c
źródło
void function();
jako deklaracja nie zapobiega wywołaniom typufunction(42);
. Użyjvoid
w deklaracji jakvoid function(void);
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
Następnie zaimplementowałbyś .h w pliku .c w następujący sposób:
klient.c
źródło