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:
#ifndef SOME_HEADER_GUARD_WITH_UNIQUE_NAME
#define SOME_HEADER_GUARD_WITH_UNIQUE_NAME
struct a
{
int i;
struct b
{
int j;
}
};
#endif
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:
struct a ;
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?
- Jika Anda menggunakan C ++, jangan.
- Jika Anda menggunakan C, Anda harus.
Alasannya adalah bahwa pengelolaan struct C bisa menyebalkan: Anda harus mendeklarasikan kata kunci struct di mana pun ia digunakan:
struct MyStruct ; /* Forward declaration */
struct MyStruct
{
/* etc. */
} ;
void doSomething(struct MyStruct * p) /* parameter */
{
struct MyStruct a ; /* variable */
/* etc */
}
Sementara typedef akan memungkinkan Anda untuk menulisnya tanpa kata kunci struct.
struct MyStructTag ; /* Forward declaration */
typedef struct MyStructTag
{
/* etc. */
} MyStruct ;
void doSomething(MyStruct * p) /* parameter */
{
MyStruct a ; /* variable */
/* etc */
}
Penting bagi Anda untuk tetap menggunakan nama struct tersebut. Penulisan:
typedef struct
{
/* etc. */
} MyStruct ;
hanya akan membuat struct anonim dengan nama typedef-ed, dan Anda tidak akan bisa meneruskan-mendeklarasikannya. Jadi pertahankan format berikut:
typedef struct MyStructTag
{
/* etc. */
} MyStruct ;
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:
typedef struct MyStruct
{
/* etc. */
} MyStruct ;
IIRC, ini sebenarnya yang dilakukan C ++ dengan deklarasi struct yang lebih sederhana, di belakang layar, agar tetap kompatibel dengan C:
// C++ explicit declaration by the user
struct MyStruct
{
/* etc. */
} ;
// C++ standard then implicitly adds the following line
typedef MyStruct MyStruct;
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 .
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.