Pertanyaan Pendukung argumen-parsing untuk C / UNIX


Saya tahu hal-hal berikut:

  • Yang terhormat getopt(3)
  • diperpanjang getopt_long
  • glibc argp parser untuk vektor argumen unix-style
  • popt dari proyek GNOME (atau penerus spiritualnya di Fasih)

Saya yakin masih ada lagi yang belum saya gunakan atau bahkan dengar; pencarian Google cepat mengungkapkan Gopt, argtable, dan Daftar pilihan.

Secara pribadi, saya suka argp terbaik, dan setiap program yang saya tulis menggunakan getopt/getopt_long (di luar garis dasar kompleksitas tertentu) telah dikonversi untuk digunakan argp. Ini lebih banyak tersedia daripada popt, lebih kuat daripada getopt_long, terdokumentasi dengan baik, konsisten dengan semua konvensi gaya GNU, dan sangat fleksibel. Pada sisi negatifnya, itu jauh dari yang paling mudah digunakan (terima kasih untuk menjadi sangat fleksibel), dan kode untuk mendukungnya cukup verbose (seperti banyak hal dalam C).

Apa yang Anda gunakan, dan mengapa?

Edit

Ya, maksud saya C daripada C ++. Ada banyak parser C ++, tapi saya tidak menggunakan C ++.

John Millikin mencatat itu popt tidak lagi dipertahankan. Saya mencantumkannya karena banyak program masih menggunakannya - termasuk AbiWord, rpm, rsync, dan samba - terlepas dari upaya Gnome untuk bermigrasi. Tapi saya sudah menambahkan tautan ke argumen Glib, parser sekarang juga.


Untuk penguraian argumen C ++, lihat pertanyaannya Apa parser librari parameter yang ada untuk C ++?


32
2017-10-10 02:51


asal


Jawaban:


GNU punya gengetopt yang menghasilkan kode untuk struktur data opsi dan getopt_long kode untuk mem-parsing baris perintah dan mengisi struktur .. Cukup mudah untuk dipelajari dan berfungsi dengan baik.

Sebagai bonus Anda dapat melewati struktur opsi di sekitar kode Anda dan menghindari penyimpanan global jika diinginkan.

Ini memberikan semantik gaya GNU (jelas), dan cukup kecil untuk hanya menyertakan dengan proyek untuk distribusi jika Anda tidak yakin lingkungan membangun audiens Anda.


14
2017-10-10 15:17



Seperti kata pepatah, "std. Lebih baik daripada lebih baik". Jadi saya selalu menggunakan getopt_long () dan apa pun yang non gnome / glibby, dan yang fasih pada apa pun yang dilakukannya.

Untuk alasan yang sama saya selalu menggunakan optparse dalam aplikasi python, meskipun memiliki banyak fitur yang hilang relatif untuk getopt_long () ... tapi itu python std.


4
2017-10-10 19:05



Karena saya mencari hal yang sama, saya membaca jawaban dari topik lama ini. Akhirnya saya memilih dropt yang disebutkan dalam Apa parser librari parameter yang ada untuk C ++? Sebenarnya ini diimplementasikan di C, jadi saya pikir itu perlu disebutkan di sini juga. Saya belum menggunakan pembantu C ++, yang membungkus implementasi C.
Fakta menarik tentang dropt:

  • Ringan
  • Hanya bergantung pada libs standar
  • Tidak ada kurva belajar yang curam
  • Cukup untuk parsing arg dasar, ditambah beberapa fitur canggih
  • Mudah diperluas
  • Lisensi tidak terbatas (zlib-ish)

Meskipun terbatas. Sebagai contoh saya harus menyesuaikan spesifikasi parameter sintaks saya sedikit; itu bisa diterima dalam kasus ini tapi tentu saja kadang-kadang spesifikasi diukir di batu.

Sebagai kesimpulan saya akan merekomendasikan dropt setidaknya untuk pembuatan prototipe yang cepat, pengembangan alat dan proyek-proyek in-house.


4
2017-07-16 07:56



popt telah ditinggalkan untuk a panjang waktu - parsing argumen digabung menjadi glib sejak versi 2.6, tiga tahun lalu.

saya menggunakan glibparser, atau port Python dari getopt.


2
2017-10-10 02:55



Saya tidak terlalu suka getopt (meskipun itu cukup standar). Salah satu solusi yang saya buat adalah fungsi argopt (). Ini C kompatibel, dapat digunakan untuk menguji apakah bendera diatur serta opsi membaca dengan nilai-nilai. Hanya mendukung opsi singkat (mis. -H) meskipun menulis fungsi serupa untuk opsi panjang (mis. --Help) seharusnya tidak terlalu sulit. Lihat contoh:

int main(int argc, char **argv){

    if(argopt(argc, argv, 'p')) printf("-p is set\n");
    if(argopt(argc, argv, 'q')) printf("-q is set\n");

    const char *f = argopt(argc, argv, 'f');
    if(f) printf("-f is %s\n",f);

    return 0;
}

Contoh dari baris perintah:

$./main -f input.txt -rq
-q is set
-f is input.txt

Disclaimer: Saya membuat fungsi ini untuk bersenang-senang, berniat untuk itu menjadi pendek, C-kompatibel, mudah digunakan, dan tidak memiliki ketergantungan. Ini dia:

const char* argopt(int argc, const char *const *argv, char key){

    for(int i=1; i<argc; i++){
        const char *c = argv[i];
        if(*c!='-') continue;
        while(*++c) if(*c==key) return argv[(i+1)%argc];
    }

    return 0;
}

1
2018-05-18 18:31



Saya sangat menyukai perpustakaan TCLAP, karena sangat fleksibel dan mudah digunakan. Ini juga benar-benar berbasis template sehingga hanya header saja.

Anda dapat menemukannya di sini: http://tclap.sourceforge.net/ 

[sunting] kesalahan saya Anda mengatakan C dan saya memposting C + + perpustakaan ..


0
2017-10-10 02:55



Saya telah mengembangkan dan menggunakan libparamset yaitu parsing parameter baris perintah yang ditulis dalam plain C. Ini menyediakan:

  • Fungsionalitas lintas platform (Linux, OSX, Windows).
  • Pengurai yang dapat dikonfigurasi di mana setiap parameter dapat bertindak berbeda (fitur yang kuat dan fleksibel).
  • Pesan yang dihasilkan secara otomatis untuk kesalahan ketik, parameter tidak dikenal, atau parameter tidak valid.
  • Fungsionalitas tambahan untuk mendesain antarmuka pengguna baris perintah.
  • Dokumentasi yang bagus.

0
2018-03-20 11:30