1.標頭檔
#include <stdio.h><br />#include <stdlib.h><br />#include <unistd.h><br />#include <getopt.h>
2.函數原型
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
longindex參數如果沒有設定為NULL,那麼它就指向一個變數,這個變數會被賦值為尋找到的長選項在longopts中的索引值
3.全域符號
(1)
struct option {<br /> char *name;<br /> int has_arg;<br /> int *flag;<br /> int val;<br />};
一般每個長選項都對應一個短選項,兩者是等價的,option結構就是用來定義長選項對應哪個短選項,name表示長選項的名稱,val表示對應的短選項,比如{ "no-proxy", no_argument, NULL, 'N' },說明--no-proxy對應與-N。
has_arg可以取值如下:
no_argument 0 選項沒有參數
requierd_argument 1 選項需要參數
optional_argument 2 選項參數可選
比如我們可以定義如下選項:
static const struct option longopts[] = {<br /> { "no-proxy", no_argument, NULL, 'N' },<br /> { "output", required_argument, NULL, 'o' },<br /> { "user-agent", required_argument, NULL, 'U' },<br /> { "verbose", no_argument, NULL, 'v' },<br /> { "quiet", no_argument, NULL, 'q' },<br /> { "help", no_argument, NULL, 'h' },<br /> { "version", no_argument, NULL, 'V' },<br /> { NULL, no_argument, NULL, 0 }<br />};
(2)
extern char *optarg<br />extern int optind, optopt, opterr
假設使用下載工具axel:
axel -q --no-proxy --max-speed=150 http://blog.csdn.net/kenby/index.html
初始時,optind的值為1,指向第1個參數,每調用一次getopt_long,optind就向後移一個單位,指向第二個參數,這樣optind總是指向下一個要處理的參數,optarg表示參數的值,比如但處理max-speed時,optarg的值為150
4.函數傳回值
(1)若沒有命令列參數,返回-1
(2)若碰到匹配的短選項, 返回對應的字元,比如碰到-N, 返回'N',若碰到匹配的長選項,返回在option數組裡面定義的val,
比如碰到--no-proxy, 返回'N'。
(3)若碰到無法識別的短選項,返回-1, 若碰到無法識別的長選項,返回'?'