Saya ingin menginisialisasi elemen struct, dibagi dalam deklarasi dan inisialisasi. Inilah yang saya miliki:
typedef struct MY_TYPE {
bool flag;
short int value;
double stuff;
} MY_TYPE;
void function(void) {
MY_TYPE a;
...
a = { true, 15, 0.123 }
}
Apakah ini cara untuk mendeklarasikan dan menginisialisasi variabel lokal MY_TYPE
sesuai dengan standar bahasa pemrograman C (C89, C90, C99, C11, dll.)? Atau ada yang lebih baik atau setidaknya berfungsi?
Pembaruan Saya akhirnya memiliki elemen inisialisasi statis di mana saya mengatur setiap subelemen sesuai dengan kebutuhan saya.
c
struct
initialization
ngeri
sumber
sumber
Jawaban:
Di (ANSI) C99, Anda dapat menggunakan penginisialisasi yang ditunjuk untuk menginisialisasi struktur:
Sunting: Anggota lain diinisialisasi sebagai nol: "Anggota bidang yang dihilangkan secara implisit diinisialisasi sama dengan objek yang memiliki durasi penyimpanan statis." ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )
sumber
Anda dapat melakukannya dengan kata majemuk literal . Menurut halaman itu, ia berfungsi di C99 (yang juga dihitung sebagai ANSI C ).
Penunjukan dalam inisialisasi adalah opsional; Anda juga bisa menulis:
sumber
Saya melihat Anda sudah menerima jawaban tentang ANSI C 99, jadi saya akan melemparkan tulang tentang ANSI C 89. ANSI C 89 memungkinkan Anda untuk menginisialisasi struct dengan cara ini:
Suatu hal yang penting untuk diingat, pada saat Anda menginisialisasi bahkan satu objek / variabel dalam struct, semua variabel lainnya akan diinisialisasi ke nilai default.
Jika Anda tidak menginisialisasi nilai dalam struct Anda, semua variabel akan berisi "nilai sampah".
Semoga berhasil!
sumber
a = (MYTYPE){ true, 15, 0.123 };
akan baik-baik saja di C99
sumber
Anda hampir mendapatkannya ...
Pencarian cepat pada 'struct initialize c' menunjukkan ini kepada saya
sumber
Standar bahasa pemrograman C ISO / IEC 9899: 1999 (umumnya dikenal sebagai C99) memungkinkan seseorang untuk menggunakan inisialisasi yang ditunjuk untuk menginisialisasi anggota struktur atau gabungan sebagai berikut:
Ini didefinisikan pada
paragraph 7
bagian6.7.8 Initialization
ISO / IEC 9899: 1999 sebagai:Perhatikan bahwa
paragraph 9
bagian yang sama menyatakan bahwa:Dalam implementasi GCC GNU namun anggota dihilangkan diinisialisasi sebagai nol atau nilai sesuai jenis seperti nol. Seperti yang dinyatakan dalam bagian 6.27 Inisialisasi yang Ditunjuk untuk dokumentasi GNU GCC:
Kompiler Microsoft Visual C ++ harus mendukung inisialisasi yang ditunjuk sejak versi 2013 menurut posting blog resmi C ++ Roadform Kesesuaian . Ayat
Initializing unions and structs
dari initializers artikel di MSDN Visual dokumentasi Studio menunjukkan bahwa anggota yang tidak disebutkan namanya diinisialisasi ke nol seperti nilai-nilai yang sesuai sama dengan GNU GCC.ISO / IEC 9899: 2011 standar (umumnya dikenal sebagai C11) yang telah menggantikan ISO / IEC 9899: 1999 mempertahankan inisialisasi yang ditunjuk di bawah bagian
6.7.9 Initialization
. Itu juga tetapparagraph 9
tidak berubah.New ISO / IEC 9899: 2018 standar (umumnya dikenal sebagai C18) yang telah digantikan ISO / IEC 9899: 2011 mempertahankan ditunjuk initializers bawah bagian
6.7.9 Initialization
. Itu juga tetapparagraph 9
tidak berubah.sumber
struct thing { union { char ch; int i; }; };
. Standar kemudian mengatakan: "Jika ada lebih sedikit inisialisasi dalam daftar kurung kurawal daripada ada elemen atau anggota agregat, atau lebih sedikit karakter dalam string literal yang digunakan untuk menginisialisasi array dengan ukuran yang diketahui daripada ada elemen dalam array, sisa agregat harus diinisialisasi secara implisit sama dengan objek yang memiliki durasi penyimpanan statis. "seperti yang dikatakan Ron Nuni:
Suatu hal yang penting untuk diingat: pada saat Anda menginisialisasi bahkan satu objek / variabel dalam struct, semua variabel lainnya akan diinisialisasi ke nilai default.
Jika Anda tidak menginisialisasi nilai-nilai dalam struct Anda (yaitu jika Anda hanya mendeklarasikan variabel itu), semua
variable.members
akan berisi "nilai-nilai sampah", hanya jika deklarasi itu lokal!Jika deklarasi global atau statis (seperti dalam kasus ini), semua yang tidak diinisialisasi
variable.members
akan diinisialisasi secara otomatis ke:0
untuk bilangan bulat dan titik apung'\0'
untukchar
(tentu saja ini sama dengan0
, danchar
merupakan tipe integer)NULL
untuk pointer.sumber
sumber
Jika MS belum memperbarui ke C99, MY_TYPE a = {true, 15,0.123};
sumber
Saya menemukan cara lain untuk menginisialisasi struct.
Struct:
Inisialisasi:
Sesuai dokumentasi GCC, sintaks ini sudah usang sejak GCC 2.5 .
sumber
Saya tidak suka jawaban ini jadi saya buat sendiri. Saya tidak tahu apakah ini ANSI C atau tidak, itu hanya GCC 4.2.1 dalam mode standarnya. Saya tidak pernah bisa mengingat tanda kurung jadi saya mulai dengan subset dari data saya dan bertempur dengan pesan kesalahan kompiler sampai ditutup. Keterbacaan adalah prioritas utama saya.
Data dapat mulai hidup sebagai file dibatasi-tab yang Anda cari-ganti untuk dipijat menjadi sesuatu yang lain. Ya, ini barang Debian. Jadi satu pasangan luar {} (menunjukkan array), lalu pasangan lain untuk setiap struct di dalamnya. Dengan koma di antara. Menempatkan hal-hal di header tidak sepenuhnya diperlukan, tapi saya punya sekitar 50 item di struct saya jadi saya ingin mereka di file yang terpisah, baik untuk menjaga kekacauan dari kode saya dan jadi lebih mudah untuk mengganti.
sumber
Struktur dalam C dapat dideklarasikan dan diinisialisasi seperti ini:
sumber
Saya telah membaca Dokumentasi Microsoft Visual Studio 2015 untuk Inisialisasi Jenis Agregat , semua bentuk inisialisasi dengan
{...}
dijelaskan di sana, tetapi inisialisasi dengan titik, bernama '' designator '' tidak disebutkan di sana. Itu tidak bekerja juga.Standar C99 bab 6.7.8 Inisialisasi menjelaskan kemungkinan perancang, tetapi dalam pikiran saya tidak begitu jelas untuk struct yang kompleks. Standar C99 sebagai pdf .
Dalam pikiran saya, mungkin lebih baik
= {0};
inisialisasi untuk semua data statis. Itu kurang usaha untuk kode mesin.Gunakan makro untuk menginisialisasi, misalnya
typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}
Makro dapat diadaptasi, daftar argumennya dapat independen dari konten struct yang berubah. Adalah tepat jika elemen yang lebih sedikit harus diinisialisasi. Ini juga tepat untuk struct bersarang. 3. Bentuk sederhana adalah: Inisialisasi dalam subrutin:
Rutin ini terlihat seperti ObjectOriented di C. Use
thiz
, bukanthis
untuk mengompilasinya dengan C ++ juga!sumber
Saya telah mencari cara yang bagus untuk menginisialisasi struct saya, dan saya harus menggunakan di bawah ini (C99). Ini memungkinkan saya menginisialisasi struktur tunggal atau array struktur dengan cara yang sama seperti tipe polos.
Ini dapat digunakan dalam kode sebagai:
sumber
jsmn_ts_default
, tetapi sisa struktur diinisialisasi seolah-olah array memiliki durasi penyimpanan statis, yang berarti bahwa anggota diinisialisasi keNULL
dan0
. Tetapi jika Anda mengubah#define jsmn_ts_default (jsmn_ts){"default", sizeof "default", NULL, 0}
Anda akan melihat bahwa hanya elemen array pertama yang diinisialisasi.int a[10] = {1};
Hanya elemen 1 yang akan==1