Co robisz?c i.rozszerzenia plików h oznaczają C?

To wszystko jest w tytule; super-proste, jak sądzę, ale tak trudno szukać czegoś w dowolnym miejscu.

Są to dwa pliki biblioteczne, które kopiuję z CS50.net , i zastanawiam się, dlaczego mają dwa różne rozszerzenia.

Author: Alex Mcp, 2009-11-08

6 answers

.c: plik c (gdzie w ogóle jest prawdziwa akcja)

.h: plik nagłówkowy (do dołączenia do dyrektywy preprocesora #include). Zawiera rzeczy, które są zwykle uważane za współdzielone z innymi częściami kodu, jak prototypy funkcji, #define ' d stuff, deklaracja extern dla zmiennych globalnych (oh, the horror) i tym podobne.

Technicznie rzecz biorąc, można umieścić wszystko w jednym pliku. Cały program C. milion linii. Ale my ludzie mamy tendencję do organizowania rzeczy. Więc tworzysz Różne pliki C, z których każdy zawiera określone funkcje. Wszystko ładnie i czysto. Wtedy nagle zdajesz sobie sprawę, że deklaracja , którą masz do danego pliku C, powinna istnieć również w innym Pliku C. Żebyś je powielał. Najlepiej jest zatem wyodrębnić deklarację i umieścić ją we wspólnym pliku, jakim jest .h

Na przykład w cs50.h można znaleźć tak zwane "deklaracje forward" swoich funkcji. Deklaracja forward jest szybkim sposobem przekazania kompilatorowi jak powinna być wywoływana funkcja (np. jakie parametry wejściowe) i co zwraca, aby mogła prawidłowo sprawdzać (na przykład jeśli wywołasz funkcję z niewłaściwą liczbą parametrów, będzie narzekać).

Kolejny przykład. Załóżmy, że napiszesz .plik C zawierający funkcję wykonującą dopasowanie wyrażeń regularnych. Chcesz, aby Twoja funkcja akceptowała Wyrażenie regularne, pasujący łańcuch znaków i parametr, który mówi, czy porównanie ma być niewrażliwe na wielkość liter.

W .c ty będzie zatem umieścić

bool matches(string regexp, string s, int flags) { the code }

Teraz Załóżmy, że chcesz przekazać następujące flagi:

0: jeśli w wyszukiwaniu rozróżnia się wielkość liter

1: Jeśli wyszukiwanie jest niewrażliwe na wielkość liter

I chcesz być otwarty na nowe flagi, więc nie umieściłeś logiki. gra z liczbami jest trudna, więc definiujesz przydatne nazwy dla tych flag

#define MATCH_CASE_SENSITIVE 0
#define MATCH_CASE_INSENSITIVE 1

Ta informacja idzie do .h, ponieważ jeśli jakiś program chce używać tych etykiet, nie ma możliwości ich poznania, chyba że włączysz info. Oczywiście można je umieścić wc, ale wtedy musiałbyś dołączyć .kod c (cały!), co jest stratą czasu i źródłem kłopotów.

 89
Author: Stefano Borini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-08 03:35:38

Oczywiście nic nie mówi, że rozszerzenie pliku nagłówkowego musi być .h, A rozszerzenie pliku źródłowego C musi być .c. Są to użyteczne konwencje.

E:\Temp> type my.interface
#ifndef MY_INTERFACE_INCLUDED
#define MYBUFFERSIZE 8
#define MY_INTERFACE_INCLUDED
#endif

E:\Temp> type my.source
#include <stdio.h>

#include "my.interface"

int main(void) {
    char x[MYBUFFERSIZE] = {0};
    x[0] = 'a';
    puts(x);
    return 0;
}

E:\Temp> gcc -x c my.source -o my.exe

E:\Temp> my
a
 15
Author: Sinan Ünür,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 16:03:10

To nie są pliki biblioteczne. To tylko pliki źródłowe. Jak powiedział Stefano, .plik C jest plikiem źródłowym C, który faktycznie używa / definiuje rzeczywiste źródło tego, co zostało tylko opisane w .h Plik, plik nagłówkowy. Plik nagłówkowy zazwyczaj przedstawia wszystkie prototypy funkcji i struktury, które będą używane w rzeczywistym pliku źródłowym. Pomyśl o tym jak o referencji / dodatku. Widać to po obejrzeniu pliku nagłówkowego, jak widać:) więc wtedy, gdy chcesz aby użyć czegoś, co zostało napisane w tych plikach źródłowych, należy #include plik nagłówkowy, który zawiera informacje, które kompilator będzie musiał znać.

 5
Author: Jorge Israel Peña,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-08 03:08:57

The .c jest plikiem źródłowym i .h jest plikiem nagłówkowym .

 2
Author: hexium,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-08 03:07:38

The .pliki c są plikami źródłowymi, które zostaną skompilowane. The .pliki h są używane do wystawiania API programu do innej części tego programu lub innego programu jest tworzenie biblioteki.

Na przykład program PizzaDelivery może mieć 1 .plik c z głównym programem, oraz 1 .plik c Z FUNKCJAMI narzędziowymi. Teraz, aby główna część programu mogła korzystać z funkcji narzędziowych, musisz udostępnić API, za pomocą prototypu funkcji, do .plik h, to .plik h zaliczony do:plik C.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-08 03:12:19
.c : 'C' source code
.h : Header file

Zazwyczaj pliki .c zawierają implementację, a Pliki .h zawierają "interfejs" implementacji.

 0
Author: AraK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-08 03:08:07