Jika saya memiliki file source.c dengan struct:
struct a {
int i;
struct b {
int j;
}
};
Bagaimana struct ini dapat digunakan di file lain (yaitu func.c
)?
Haruskah saya membuat file header baru, mendeklarasikan struct di sana dan memasukkan header itu ke dalam func.c
?
Atau haruskah saya mendefinisikan seluruh struct dalam file header dan memasukkannya ke dalam source.c
dan func.c
? Bagaimana struct dideklarasikan extern
di kedua file?
Haruskah saya typedef
melakukannya? Jika ya, bagaimana caranya?
struct b
, tapi kemudian struktur Andaa
menyatakan tipe yang tidak digunakan (Anda mungkin harus mendefinisikan nama anggota, mungkink
, setelah kurung kurawal tutup dan sebelum titik koma.Jawaban:
jika struktur ini akan digunakan oleh beberapa file func.c lainnya bagaimana melakukannya?
Ketika sebuah tipe digunakan dalam sebuah file (yaitu func.c file), itu harus terlihat. Cara terburuk untuk melakukannya adalah menyalin dan menempelkannya di setiap file sumber yang membutuhkannya.
Cara yang benar adalah meletakkannya di file header, dan menyertakan file header ini kapan pun diperlukan.
haruskah kita membuka file header baru dan mendeklarasikan strukturnya di sana dan memasukkan header itu ke dalam func.c?
Ini adalah solusi yang lebih saya sukai, karena membuat kode sangat modular. Saya akan mengkodekan struct Anda sebagai:
Saya akan meletakkan fungsi menggunakan struktur ini di header yang sama (fungsi yang "secara semantik" bagian dari "antarmuka").
Dan biasanya, saya dapat menamai file tersebut setelah nama struktur, dan menggunakan nama itu lagi untuk memilih definisi pelindung header.
Jika Anda perlu mendeklarasikan fungsi menggunakan pointer ke struct, Anda tidak memerlukan definisi struct lengkap. Deklarasi maju sederhana seperti:
Akan cukup, dan itu mengurangi kopling.
atau dapatkah kita mendefinisikan struktur total dalam file header dan memasukkannya ke dalam source.c dan func.c?
Ini adalah cara lain, agak lebih mudah, tetapi kurang modular: Beberapa kode yang hanya membutuhkan struktur Anda untuk bekerja tetap harus menyertakan semua jenis.
Di C ++, ini bisa menyebabkan komplikasi yang menarik, tetapi ini di luar topik (tidak ada tag C ++), jadi saya tidak akan menjelaskannya.
lalu bagaimana mendeklarasikan struktur itu sebagai eksternal di kedua file. ?
Saya gagal untuk memahami intinya, mungkin, tapi Greg Hewgill memiliki jawaban yang sangat bagus dalam postingnya Bagaimana cara mendeklarasikan struktur di header yang akan digunakan oleh banyak file di c? .
haruskah kita mengetiknya lalu bagaimana?
Alasannya adalah bahwa pengelolaan struct C bisa menyebalkan: Anda harus mendeklarasikan kata kunci struct di mana pun ia digunakan:
Sementara typedef akan memungkinkan Anda untuk menulisnya tanpa kata kunci struct.
Penting bagi Anda untuk tetap menggunakan nama struct tersebut. Penulisan:
hanya akan membuat struct anonim dengan nama typedef-ed, dan Anda tidak akan bisa meneruskan-mendeklarasikannya. Jadi pertahankan format berikut:
Dengan demikian, Anda akan dapat menggunakan MyStruct di mana pun Anda ingin menghindari penambahan kata kunci struct, dan masih menggunakan MyStructTag ketika typedef tidak berfungsi (yaitu deklarasi maju)
Edit:
Mengoreksi asumsi yang salah tentang deklarasi struct C99, seperti yang dikatakan oleh Jonathan Leffler .
Sunting 01-06-2018:
Craig Barnes mengingatkan kita dalam komentarnya bahwa Anda tidak perlu memisahkan nama untuk nama struct "tag" dan nama "typedef", seperti yang saya lakukan di atas untuk kejelasan.
Memang, kode di atas bisa juga ditulis sebagai:
IIRC, ini sebenarnya yang dilakukan C ++ dengan deklarasi struct yang lebih sederhana, di belakang layar, agar tetap kompatibel dengan C:
Kembali ke C, saya telah melihat kedua penggunaan (nama terpisah dan nama yang sama), dan tidak ada yang memiliki kekurangan yang saya ketahui, jadi menggunakan nama yang sama membuat pembacaan lebih sederhana jika Anda tidak menggunakan C "ruang nama" terpisah untuk struct dan simbol lainnya .
sumber
struct
tag dantypedef
nama. C menggunakan namespace yang berbeda untukstruct
tag, sehingga Anda dapat menggunakanMyStruct
keduanya.Untuk definisi struktur yang akan digunakan di lebih dari satu file sumber, Anda harus meletakkannya di file header. Kemudian sertakan file header itu di file sumber apa pun yang membutuhkan struktur.
The
extern
deklarasi tidak digunakan untuk definisi struktur, tetapi malah digunakan untuk deklarasi variabel (yaitu, beberapa nilai data dengan tipe struktur yang telah ditentukan). Jika Anda ingin menggunakan variabel yang sama di lebih dari satu file sumber, deklarasikan sepertiextern
di file header seperti:Kemudian, dalam satu file sumber, tentukan variabel sebenarnya:
Jika Anda lupa melakukan ini atau secara tidak sengaja mendefinisikannya dalam dua file sumber, linker akan memberi tahu Anda tentang ini.
sumber
GLOBAL
sebagaiextern
atau tidak sama sekali di bagian atas tajuk dan kemudian mendeklarasikan variabel sebagaiGLOBAL struct a myAValue;
. Dari sebagian besar file sumber, Anda mengatur#define GLOBAL extern
versi yang akan digunakan ( mendeklarasikan variabel) dan dari satu file sumber yang tepat, hal itu menyebabkan definisi kosong digunakan sehingga variabel ditentukan .ah:
begitulah, sekarang Anda hanya perlu menyertakan ah ke file tempat Anda ingin menggunakan struktur ini.
sumber