Widziałem zarówno pełne definicje struct
s w nagłówkach, jak i same deklaracje - czy jest jakaś przewaga jednej metody nad drugą?
Jeśli to robi różnicę, zwykle wpisuję taką strukturę w .h
typedef struct s s_t;
Edytować
Dla jasności, opcje to deklaracja w pliku nagłówkowym i definicja w klasie lub zarówno deklaracja, jak i definicja w pliku nagłówkowym. Oba powinny skutkować taką samą użytecznością, nawet jeśli jest to połączenie, prawda?
Widzę wiele prawie duplikatów, np. Tutaj, ale nie ma dokładnych dopasowań. Proszę mnie poprawić, jeśli się mylę w tej kwestii.
_t
są zarezerwowane przez POSIX, więc jest to zwykle zły pomysł. Możesz po prostu zrobićtypedef struct toto toto
._t
zastosowań innych miejsc (np. Lighttp, linux) ... i przedrostuję rzeczy z projident_, więc to nie powinno być problemem, prawda?C
ish, nie (co zFILE
przykładem itp.). Więc nie-nieprzezroczysty.Odpowiedzi:
Struktury prywatne tego pliku powinny znajdować się w pliku .c, z deklaracją w pliku .h, jeśli są używane przez jakąkolwiek funkcję w .h.
Struktury publiczne powinny znajdować się w pliku .h.
źródło
global
ilocal
widoczność?public
nie ma sensu w strukturze. Wszystkie struktury są domyślnie publiczne.public
nie jest słowem kluczowym w C. Jeśli spojrzysz na odpowiedź Matthew Slattery'ego poniżej, zobaczysz, że użycie tylko deklaracji do przodu w nagłówku powoduje błąd kompilatora, gdy użytkownik próbuje użyć członków prywatna (nieprzezroczysta) struktura.Nie, nie biorąc pod uwagę innych plików .c zawierających ten sam nagłówek. Jeśli definicja struktury nie jest widoczna dla kompilatora, nie można użyć szczegółów tej definicji. Deklaracja bez definicji (np. Po prostu
struct s;
) powoduje niepowodzenie kompilatora, jeśli cokolwiek próbuje zajrzeć do środkastruct s
, jednocześnie pozwalając mu np. Na kompilacjęstruct s *foo;
(o ilefoo
nie zostanie później dereferencjonowana).Porównaj te wersje
api.h
iapi.c
:Ten klient interfejsu API działa z dowolną wersją:
Ten przegląda szczegóły implementacji:
który będzie działał z wersją "definicja w nagłówku", ale nie z wersją "definicja w implementacji", ponieważ w tym drugim przypadku kompilator nie ma widoczności układu struktury:
Tak więc wersja „definicja we wdrożeniu” chroni przed przypadkowym lub umyślnym niewłaściwym wykorzystaniem prywatnych szczegółów implementacji.
źródło
dereferencing pointer to incomplete type
był dokładnie w moim przypadku!Jeśli struktura ma być używana przez inne jednostki kompilacji (pliki .c), umieść ją w pliku nagłówkowym, abyś mógł dołączyć ten plik nagłówkowy tam, gdzie jest potrzebny.
Jeśli struktura jest używana tylko w jednej jednostce kompilacji (plik .c), należy umieścić ją w tym pliku .c.
źródło
Chodzi o to, że umieszczenie go w pliku nagłówkowym umożliwia użycie struktury (lub dowolnej innej definicji) z wielu plików źródłowych, po prostu przez dołączenie tego pliku nagłówkowego.
Ale jeśli masz pewność, że zostanie użyty tylko z jednego pliku źródłowego, to naprawdę nie robi to żadnej różnicy.
źródło
Umieściłem je w pliku C, aby był bardziej zorientowany obiektowo, zobacz ten artykuł .
źródło
Generalnie nie sądzę, aby miało to duże znaczenie, czy umieścisz je w nagłówku czy w plikach źródłowych. Jeśli jednak potrzebujesz uzyskać dostęp do elementów struktury z wielu plików źródłowych, łatwiej jest umieścić strukturę w pliku nagłówkowym i dołączyć ją z innych plików, w których jest potrzebna.
źródło