Rumah >pembangunan bahagian belakang >C++ >Mengapakah Sesetengah Penyusun Membenarkan Tatasusunan Panjang Berubah dalam C Manakala Yang Lain Tidak?

Mengapakah Sesetengah Penyusun Membenarkan Tatasusunan Panjang Berubah dalam C Manakala Yang Lain Tidak?

Patricia Arquette
Patricia Arquetteasal
2024-12-17 11:05:26989semak imbas

Why Do Some Compilers Allow Variable Length Arrays in C   While Others Don't?

Tatasusunan Panjang Pembolehubah dan Ungkapan Malar

Serpihan kod C yang dibentangkan di bawah berpotensi untuk berjaya disusun dengan penyusun tertentu:

int main()
{
  int size = 10;
  int arr[size];
}

Menurut Piawaian C (8.3.4/1), kod ini dijangka akan ditolak kerana saiz tatasusunan (arr) perlu menjadi ungkapan tetap. Walau bagaimanapun, ia menimbulkan persoalan tentang gelagat pengkompil seperti gcc 4.8 dan Clang 3.2.

Tatasusunan Panjang Pembolehubah (VLA) mula dimainkan dalam senario ini. VLA ialah ciri C99 yang telah dilaksanakan oleh gcc dan clang sebagai sambungan dalam C . Walau bagaimanapun, Visual Studio mematuhi piawaian dalam kes ini. Mesej yang dijana:

error C2466: cannot allocate an array of constant size 0

menunjukkan bahawa ia betul-betul mentafsir saiz sebagai sifar, yang tidak dibenarkan dalam konteks ini.

Jika anda mendayakan bendera -pedantic dalam kedua-dua gcc dan clang , anda akan menerima amaran mengenai penggunaan VLA. Sebagai contoh, gcc menyatakan:

warning: ISO C++ forbids variable length array 'arr' [-Wvla]
  int arr[size];
              ^

Selain itu, menggunakan bendera -pedantic-errors akan menyebabkan penggunaan ini ralat. Rujuk dokumentasi yang disediakan untuk mendapatkan maklumat lanjut tentang standard bahasa yang disokong.

Draf piawaian C mentakrifkan ungkapan pemalar kamiran dalam 5.19 (Ungkapan pemalar) seperti berikut:

"Ungkapan pemalar kamiran ialah ungkapan jenis penghitungan kamiran atau tidak berskop, secara tersirat ditukar kepada nilai, dengan ungkapan yang ditukar ialah pemalar teras ungkapan."

Untuk mencapai pematuhan dengan standard, anda boleh memulakan saiz dengan literal menggunakan const (atau constexpr). Ini akan menjadikan saiz sebagai ungkapan pemalar integral:

const int size = 10;
// or
constexpr int size = 10;

Bahagian yang sepadan dalam piawai draf C99 (6.7.5.2) menjelaskan bahawa jika saiz tidak ada, jenis tatasusunan yang tidak lengkap akan diisytiharkan. Jika saiznya ialah *, jenis tatasusunan panjang berubah dibuat tanpa panjang yang ditentukan dan hanya boleh digunakan dalam konteks tertentu. Jika tidak, ia sama ada jenis tatasusunan biasa atau jenis tatasusunan panjang berubah-ubah berdasarkan sifat ungkapan.

Atas ialah kandungan terperinci Mengapakah Sesetengah Penyusun Membenarkan Tatasusunan Panjang Berubah dalam C Manakala Yang Lain Tidak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn