Saya telah melihat definisi lengkap struct
s di header dan hanya deklarasi — adakah keuntungan dari satu metode dibandingkan yang lain?
Jika itu membuat perbedaan, saya biasanya mengetikkan struct seperti itu di .h
typedef struct s s_t;
Edit
Agar jelas, opsinya adalah deklarasi di file header dan definisi di kelas, atau deklarasi dan definisi di file header. Keduanya harus menghasilkan kegunaan yang sama, bahkan jika satu dengan keterkaitan, bukan?
Saya melihat banyak duplikat yang hampir sama, misalnya di sini tetapi tidak ada yang sama persis. Harap perbaiki saya jika saya salah dalam hal ini.
_t
disediakan oleh POSIX, jadi ini biasanya ide yang buruk. Anda bisa melakukannyatypedef struct toto toto
._t
penggunaan di tempat lain (misalnya, lighttp, linux) ... dan saya mengawali sesuatu dengan projident_ jadi, itu seharusnya tidak menjadi masalah, bukan?C
ish, tidak (apa denganFILE
contoh dll). Jadi, tidak buram.Jawaban:
Struktur privat untuk file itu harus berada dalam file .c, dengan deklarasi dalam file .h jika mereka digunakan oleh fungsi apa pun di .h.
Struktur publik harus masuk dalam file .h.
sumber
global
danlocal
visibilitas?public
tidak masuk akal dalam sebuah struct. Semua struct bersifat publik secara default.public
bukan kata kunci dalam C. Jika Anda melihat jawaban Matthew Slattery di bawah ini, Anda dapat melihat bagaimana hanya menggunakan deklarasi maju di tajuk yang menyebabkan kesalahan kompiler ketika pengguna mencoba menggunakan anggota a struct pribadi (buram).Tidak, tidak saat Anda mempertimbangkan file .c lain termasuk header yang sama. Jika definisi struktur tidak terlihat oleh kompiler, detail definisi tersebut tidak dapat digunakan. Sebuah deklarasi tanpa definisi (misalnya hanya
struct s;
) menyebabkan kompilator gagal jika ada yang mencoba untuk melihat ke dalamstruct s
, sementara masih mengizinkannya untuk, misalnya kompilasistruct s *foo;
(selamafoo
tidak direferensikan nanti).Bandingkan versi berikut dari
api.h
danapi.c
:Klien API ini bekerja dengan salah satu versi:
Yang ini mengaduk-aduk detail implementasi:
yang akan bekerja dengan versi "definisi dalam header", tetapi tidak dengan versi "definisi dalam implementasi", karena dalam kasus terakhir kompilator tidak memiliki visibilitas tata letak struktur:
Jadi, versi "definisi dalam implementasi" melindungi dari penyalahgunaan detail implementasi pribadi yang tidak disengaja atau disengaja.
sumber
dereferencing pointer to incomplete type
adalah kasus saya!Jika struct akan digunakan oleh unit kompilasi lain (file .c), letakkan di file header sehingga Anda dapat menyertakan file header itu dimanapun dibutuhkan.
Jika struct hanya digunakan dalam satu unit kompilasi (file .c), Anda menempatkannya di file .c tersebut.
sumber
Intinya adalah, menempatkannya di file header memungkinkan Anda menggunakan struktur (atau definisi lainnya) dari beberapa file sumber, hanya dengan memasukkan file header tersebut.
Tetapi jika Anda yakin itu hanya akan digunakan dari satu file sumber, maka tidak ada bedanya.
sumber
Saya memasukkannya ke dalam file C agar lebih Berorientasi Objek, lihat artikel ini .
sumber
Secara umum, saya tidak berpikir itu membuat perbedaan besar apakah Anda meletakkannya di header atau file sumber. Namun, jika Anda perlu mengakses anggota struktur dari beberapa file sumber, akan lebih mudah untuk meletakkan struktur di file header dan menyertakannya dari file lain yang memerlukan struktur tersebut.
sumber