getopt_long ile Uzun Seçeneklerin Çözümlenmesi
Önceki getopt Sonraki
getopt_long ile Uzun Seçeneklerin Çözümlenmesi
Tek karakterlik seçeneklerin yanında GNU tarzı uzun seçeneklerinde kabul edilmesi için getopt yerine getopt_long işlevini kullanabilirsiniz. Bu işlev unistd.h değil, getopt.h başlık dosyasında bildirilmiştir. Her ne kadar ek bir çalışma gerektirse de yazılımı kullanan acemilerin yazılım kullanımını hatırlamalarına yardımcı olacağından[102] yazılımınız her tek karakterlik seçenek için bir uzun seçenek kabul etmelidir.
struct option
veri türü
Bu yapı getopt_long işlevinin hatırı için tek bir uzun seçenek ismini açıklar. İşlevin uzun-seçenekler argümanı her elemanı bir uzun seçenek içeren bu yapıların bir dizisi olmalıdır. Dizi tamamı sıfır içeren bir elemanla sonlandırılır.
struct option yapısı şu alanlara sahiptir:
const char *name
Seçeneğin isimini içerir. Bir dizgedir.
int has_arg
Seçeneğin bir argüman alıp almadığı belirtilir. Bir tamsayıdır ve üç meşru değerden birini içerir: no_argument (argümansız), required_argument (argüman gerekli) ve optional_argument (argüman isteğe bağlı).
int *flag
int val
Bu alanlar bu seçeneğe rastlandığında nasıl raporlanacağı ve rölünü denetler.
flag bir boş gösterici ise, val bu seçeneği kimliklendiren bir değerdir. Bu değerler çoğunlukla, belli bir uzun seçeneği eşsiz olarak kimliklendirecek şekilde seçilirler.
flag bir boş gösterici değilse, bu seçenek için bir bayrak olan int türünde bir değişkenin adresi olmalıdır. val içindeki değer de, seçeneğe rastlandığını belirten bayrakta saklanacak değerdir.
int getopt_long
(int                  argc,
 char *const         *argv,
 const char          *kısa-seçenekler,
 const struct option *uzun-seçenekler,
 int                 *indis-göstr)
işlev
argv vektöründen seçenekleri ayıklar. kısa-seçenekler argümanı getopt işlevindeki gibi kabul edilecek kısa seçenekleri açıklar. uzun-seçenekler argümanı ise yukarıda bahsedildiği gibi kabul edilen uzun seçenekleri açıklar.
getopt_long bir kısa seçeneğe rastlarsa getopt işlevinin yaptığını yapar: seçeneğin karakter kodu ile döner ve seçenek argümanını (eğer varsa) optarg içinde saklar.
getopt_long bir uzun seçeneğe rastlarsa, bu seçeneği tanımlayan flag ve val üzerine tabanlanmış eylemleri ele alır.
Eğer flag bir boş gösterici ise, getopt_long işlevi hangi seçeneğin bulunduğunu belirtmek için val içeriği ile döner. val alanındaki değerleri, farklı anlamlara gelen seçenekleri ayıklamak üzere düzenlemelisiniz, böylece işlev döndükten sonra bu değerleri çözümleyebilirsiniz. Uzun seçenek bir kısa seçeneğin eşdeğeri ise, val içinde kısa seçeneğin karakter kodunu kullanabilirsiniz.
Eğer flag bir boş gösterici değilse, bu, seçeneğin yazılımda bir bayrağı etkinleştirdiği anlamına gelir. Bayrak sizin tanımlayacağınız int türünde bir değişkendir. Bayrağın adresini flag alanına ve saklamasını istediğiniz değeri val alanına koyun. Bu durumda, getopt_long işlevi 0 ile döner.
Herhangi bir uzun seçenek için, getopt_long işlevi seçenek tanımlarını içeren uzun-seçenekler dizisinin seçeneği içeren elemanının indisini *indis-göstr içinde saklayarak döndürür. Seçeneğin ismini uzun-seçenekler[*indis-göstr].name ile alabilirsiniz. Uzun seçenekleri, val alanlarındaki değerlerine göre ya da indislerine göre ayrımsayabilirsiniz. Ayrıca bir bayrak tanımlayan uzun seçenekleri bu yolla da ayrımsayabilirsiniz.
Bir uzun seçenek bir argümana sahipse, getopt_long işlevi dönmeden önce argüman değerini optarg değişkenine atar. Seçenek argümana sahip değilse, optarg değişkenindeki değer bir boş gösterici olacaktır. Bu durum bir isteğe bağlı argüman olup olmadığını size söyleyebilir.
getopt_long artık seçenek bulamazsa, -1 değeri ile döner ve argv dizisindeki sonraki argümanın indisini optind değişkenine atar.
getopt_long işlevinin devreye girmesinden önce --option value gibi seçenekler yerine -option value gibi uzun seçenekleri tanıyan yazılım arayüzleri sayesinde uzun seçenek isimleri daha önce de kullanılmaktaydı. Bu yazılımların GNU'nun getopt işlevselliğini kullanabilmelerini sağlamak için bir işlev daha vardır.
int getopt_long_only
(int                  argc,
 char *const         *argv,
 const char          *kısa-seçenekler,
 const struct option *uzun-seçenekler,
 int                 *indis-göstr)
işlev
getopt_long_only işlevi uygulamanın kullanıcısına -- yerine - ile başlayan uzun seçenekler belirtme imkanı vermesi dışında getopt_long işlevine eşdeğerdir. -- ile başlayan seçenekler yine tanınırken - ile başlayan seçenekler için işlev önce dizgeye karşılık bir uzun seçenek ismi var mı diye bakar, yoksa dizgenin karakterlerini kısa seçeneklerle eşlemeye çalışır.
getopt_long_only işlevinin şu komut satırıyla çalıştırılan bir yazılımın seçeneklerini çözümlemek için kullanıldığını varsayalım:
  app -foo
getopt_long_only işlevi önce foo isimli bir uzun seçeneğin varlığına bakacaktır. Eğer bulamazsa, f, o ve o kısa seçenklerinin varlığına bakacaktır.


[102] Ç.N.:İngilizce düşünen acemiler için evet de, anadili ingilizce olmayanlar için uzun seçeneklerin de diğer iletiler gibi yerel dile çevrilmesi sağlansa iyi olacak.
Önceki Üst Ana Başlık Sonraki
getopt Örneği Başlangıç getopt_long Kullanım Örneği.
Bir Linux Kitaplığı Sayfası