File header mana yang harus saya panggil #include
agar dapat menggunakan PATH_MAX sebagai int untuk mengukur string?
Saya ingin bisa menyatakan:
char *current_path[PATH_MAX];
Tetapi ketika saya melakukannya kompiler saya (Clang / LLVM di Linux) mengeluarkan kesalahan berikut:
recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
^
Saya mencoba melakukan pencarian google tetapi masih tidak berhasil.
#include <limits.h>
TIDAK memperbaiki masalah / error.
Apakah saya juga benar bahwa nilai PATH_MAX adalah int?
char current_path[PATH_MAX];
bukannyachar *current_path[PATH_MAX];
- Anda menginginkan string daripada array pointer.Jawaban:
Ini masuk
linux/limits.h
.#define PATH_MAX 4096 /* # chars in a path name including nul */
PATH_MAX
memiliki beberapa kekurangan seperti yang disebutkan di blog ini (terima kasih paulsm4)sumber
<limits.h>
mengatakan: Definisi salah satu konstanta simbolik dalam daftar berikut harus dihilangkan dari<limits.h>
header […] di mana nilai yang sesuai sama atau lebih besar dari minimum yang dinyatakan, tetapi nilainya dapat bervariasi tergantung pada file untuk itu diterapkan. Nilai sebenarnya yang didukung untuk nama jalur tertentu harus disediakan oleh fungsi pathconf ().Sadarilah, bahwa masih belum jelas apakah
PATH_MAX
mendefinisikan panjang maksimum dengan atau tanpa byte nol trailing. Ini mungkin salah satu atau yang lain di sistem operasi yang berbeda. Jika Anda tidak dapat atau tidak ingin memeriksa kasus mana itu selama kompilasi, lebih aman untuk memaksakan batasan buatanPATH_MAX - 1
. Lebih baik aman daripada menyesal. (Jelas, Anda masih perlu mencadangkan setidaknyaPATH_MAX
byte memori untuk menyangga string.)sumber
{PATH_MAX}
Jumlah maksimum byte dalam nama jalur, termasuk karakter null yang mengakhiri. Dari POSIX '01.<limits.h>
(Dasar Pemikiran): {PATH_MAX} IEEE PASC Interpretation 1003.1 # 15 mengatasi ketidakkonsistenan dalam standar dengan definisi nama jalur dan deskripsi {PATH_MAX}, memungkinkan pengembang aplikasi untuk mengalokasikan {PATH_MAX} atau {PATH_MAX} +1 byte. Ketidakkonsistenan telah dihapus dengan koreksi pada definisi {PATH_MAX} untuk menyertakan karakter null. Dengan perubahan ini, aplikasi yang sebelumnya mengalokasikan {PATH_MAX} byte akan terus berhasil.PATH_MAX - 1
, tetapiPATH_MAX + 1
. Anda tidak perlu lagi, tetapi Anda ingin menambahkan satu byte untuk file'\0'
.Cara portabel untuk melakukannya adalah:
Spesifikasi: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html
sumber
PATH_MAX
tidak harus didefinisikan: "Definisi salah satu konstanta simbolik dalam daftar berikut harus dihilangkan dari<limits.h>
tajuk pada implementasi tertentu yang nilainya sama atau lebih besar dari minimum yang dinyatakan, tetapi nilainya dapat bervariasi bergantung pada file yang diterapkan. Nilai sebenarnya yang didukung untuk nama jalur tertentu harus disediakan olehpathconf()
fungsi. " Mengingat sistem file Linux mendukung nilai yang berbeda, mungkin ini merupakan pelanggaran terhadap standar POSIX yang didefinisikan oleh LinuxPATH_MAX
.Saat melakukan pemrograman C sederhana, saya menghadapi tantangan yang sama. Pada sistem Linux Anda, / usr / include direktori berisi banyak, di sini file header khusus untuk OS Linux.
Anda akan melihat beberapa header yang mendefinisikan PATH_MAX; sayangnya nilai ini didefinisikan secara berbeda di header yang berbeda. Berikut ini daftar dari Ubuntu saya (saya juga secara manual menghapus beberapa klik positif palsu dari program grep).
Header /linux/limits.h memiliki angka terbesar dan harus yang paling otentik untuk disertakan. Strategi alternatif adalah mendefinisikan milik Anda sendiri dengan nama yang berbeda, katakanlah PATHLEN (4080 cukup panjang untuk kebanyakan situasi praktis). Poin utama saya adalah belajar menggunakan find untuk mencari jawaban atas pertanyaan Anda.
sumber
PATH_MAX adalah batas sistem. Ada tiga kategori tentang batasan sistem yang ada di lingkungan POSIX. Salah satu kategori ini adalah Pathname Variable Values . Batasan sistem yang bergantung pada sistem file termasuk dalam kategori ini. PATHMAX juga merupakan nilai variabel pathname. (sehingga nilai ini dapat berubah dari sistem file ke sistem file.) Jadi, batas PATHNAME dapat diperoleh dengan fungsi POSIX pathconf () / fpathconf () . Cara ini merupakan cara portabel untuk mendapatkan batasan PATHNAME dari sistem file tertentu. Contoh kode seperti di bawah ini:
sumber