Saya sering menggunakan string literal tables dalam kode C saya. Semua tabel ini terlihat kurang lebih seperti ini:
static const char* const stateNames[STATE_AMOUNT] =
{
"Init state",
"Run state",
"Pause state",
"Error state",
};
Masalah dengan kode di atas adalah jika tabel menjadi lebih panjang dan dimodifikasi selama pengembangan, saya lupa koma dari waktu ke waktu. Kode dikompilasi tanpa masalah dengan koma yang hilang, tetapi program saya berakhir mogok ketika string terakhir diatur ke NULL
. Saya menggunakan kompiler MinGW dan Keil untuk memverifikasi.
Apakah ada cara untuk menghasilkan peringatan kompiler untuk inisialisasi saya jika koma hilang?
c
initialization
Jonny Schubert
sumber
sumber
Jawaban:
Membungkus setiap
const char*
dalam tanda kurung harus menyelesaikan masalah seperti yang ditunjukkan dalam cuplikan berikut:Jika Anda lupa koma, Anda akan mendapatkan kesalahan kompilasi yang mirip dengan:
error: called object is not a function or function pointer
LIVE DEMO
Perhatikan bahwa jika Anda lupa koma, apa yang sebenarnya terjadi adalah bahwa C akan benar-benar menyatukan dua (atau lebih) string hingga koma berikutnya, atau akhir array. Misalnya, Anda lupa koma seperti yang ditunjukkan di bawah ini:
Inilah yang
gcc-9.2
menghasilkan (kompiler lain menghasilkan kode serupa):Jelas bahwa tiga string terakhir digabungkan dan array bukan panjang yang Anda harapkan.
sumber
Anda bisa membiarkan kompilator menghitung array dan menghasilkan pesan kesalahan jika hasil yang tidak diharapkan:
Lihat utas ini untuk gagasan untuk diterapkan
_Static_assert
jika kompiler Anda sudah sangat tua dan tidak mendukungnya.Sebagai bonus, ini juga dapat membantu ketika Anda menambahkan status baru tetapi lupa memperbarui tabel string. Tetapi Anda mungkin ingin melihat X Macro juga.
sumber
Saya selalu menggunakan referensi ke array berukuran eksplisit untuk menyelesaikan ini.
http://coliru.stacked-crooked.com/a/593fc2eac80782a6
sumber
Ini tidak membawa kompiler untuk membantu Anda, tetapi saya merasa menulisnya seperti di bawah ini memudahkan manusia untuk tidak menjatuhkan koma:
sumber