2016-03-14 67 views
10

W C: The Complete Reference Herbert Schildt mówi, żeCzy nagłówek może istnieć bez pliku?

Nagłówki są zazwyczaj pliki, ale nie zawsze są pliki. Dopuszczalne jest, aby kompilator wstępnie zdefiniował zawartość nagłówka wewnątrz. Jednak ze względów praktycznych standardowe nagłówki c zawarte są w plikach odpowiadających ich nazwom.

W jaki sposób nagłówek może istnieć bez pliku? Jaki jest motyw tego fragmentu? Ponieważ rozszerzenie pliku .h jest używane z nagłówkiem.

+2

Na przykład możesz powiedzieć "#include"/path/to/some/named/pipe "'. Oczywiście można by się spodziewać, że nazwana potok zawsze istnieje dla każdej jednostki kompilacji, ale zapewnia, że ​​może być trudniejsza niż jest warta (pamiętaj, że pierwsza jednostka kompilacji, która "chwyci" nazwaną potokową, może zamknąć tę potokę dla późniejszych jednostek kompilacji) – inetknght

+3

Czy możesz dodać nieco więcej kontekstu wokół cytatu? – edmz

+0

Przypuszczam, że mój komentarz dotyczy raczej '# include', a nie nagłówków. Czego więcej kontekstu chcesz? – inetknght

Odpowiedz

6

C Standardowy robi różnicę między plikami nagłówka i źródłowych określonych przez #include przerób dyrektyw: dołączania plików

6.10.2 Źródło

ograniczeń

1 dyrektywy #include identyfikuje nagłówek lub plik źródłowy, który może być przetwarzany przez implementację.

semantyka

2 Dyrektywa A obróbki wstępnej formy

# include <h-char-sequence> new-line 

wyszukiwania sekwencji miejsc realizacji zdefiniowanej dla nagłówka jednoznacznie poprzez określonej sekwencji pomiędzy < i> ograniczników i powoduje, że zastąpienie tej dyrektywy całą treścią nagłówka. Sposób określania miejsc lub zidentyfikowany nagłówek jest zdefiniowany przez implementację.

3 Dyrektywa przerób formularza

# include "q-char-sequence" new-line 

powoduje zastąpienie tej dyrektywy przez całą zawartość pliku źródłowego zidentyfikowane przez podanej kolejności między "ograniczników. Podany plik źródłowy jest przeszukiwany w sposób wdrożenia określone. Jeśli wyszukiwanie nie jest obsługiwany, lub jeśli poszukiwania nie powiedzie, dyrektywa jest przetworzony tak, jakby czytać

# include <h-char-sequence> new-line 

z identycznym zawartej sekwencji (w tym> znaków, jeśli w ogóle) z lub Dyrektywa iginal.

Kompilator może zaimplementować schemat, w którym standardowe nagłówki nie są faktycznie przechowywane jako pliki w systemie plików. Ale dyrektywa #include "filename.h" jest określona jako poszukiwanie pierwszy dla pliku w specyficzny sposób systemu, a następnie szukają standardowych nagłówków jak gdyby dyrektywa była #include <filename.h>

Należy pamiętać, że rozszerzenia nazw plików .c i .h są czysto konwencja odróżnić pliki zawierające deklaracje i pliki zawierające rzeczywiste definicje kodów i danych. Nic w standardzie nie czyni tej konwencji wymogiem, poza nazwami używanymi dla standardowych nagłówków. Niektórzy używają innych konwencji z różnymi rozszerzeniami lub bez rozszerzeń dla konkretnych potrzeb, ale zdecydowana większość programistów C uznałaby to za złą praktykę.

Shafik Yaghmour umieszczono cytat z C99 Uzasadnienie w odpowiedzi na podobne pytanie, że paznokcie zamiarem komisji w tej sprawie: https://stackoverflow.com/a/27262904/4593267

4

Standard C wyraźnie mówi, że nagłówek jest plikiem, więc nie sądzę .

6.10.2 Plik źródłowy włączenie

Dyrektywa #include określa plik nagłówka lub źródła, które mogą być przetwarzane przez realizacji.

Jednak to, co liczy się jako plik dla danego systemu, jest zdefiniowane przez implementację. Może to być teoretycznie port sprzętowy, rura lub jakaś inna głupota. Większość głównych systemów operacyjnych ma możliwość traktowania portów lub potoków jako plików (na przykład w systemie Windows pliki i porty sprzętowe są otwierane za pomocą tej samej funkcji).

+3

W sekcji 7.1.2 "Standardowe nagłówki" standardy mają przypis "Nagłówek niekoniecznie jest plikiem źródłowym, ani też < and > ograniczone w nazwach nagłówków koniecznie prawidłowe nazwy plików źródłowych.", Więc plik odnosi się tylko do " plik źródłowy ", a nie nagłówek –

+0

Myślę, że to zdanie powinno zostać przetworzone jako lub , a nie lub ". Poniższe akapity uściślają to rozróżnienie. – chqrlie

+0

@zauguin Tak? Nuty stóp nie są normatywne w normach ISO. – Lundin

0

Hipotetyczny kompilator C nie wymaga systemu plików. To może przetwarzać dyrektywy #include inaczej:

  • mogło zapytania do bazy danych (IIRC trochę IBM kompilator tak, że w 1980 roku, baza danych zawierała cache AST)

  • mógł przetwarzać standard zawiera w przeciwnym razie oznacza to, że napotyka on na #include <stdio.h> - w pewnych warunkach - zmienia swój stan wewnętrzny (zgodnie z tym, czego wymaga standard) bez uzyskiwania dostępu do pliku nagłówkowego plik. Innymi słowy, standardowe nagłówki mogą być "wbudowane".

W praktyce wszystkie kompilatory C, które znam, używają systemu plików dla nagłówków. Ale przeczytaj o precompiled headers in GCC.

BTW, wzmianka o "pliku nagłówkowym" w specyfikacji C11 n1570 nie wymaga systemu plików (jak w zwykłych systemach operacyjnych).