用getopt解析命令行參數

轉自: http://cn.programmingnote.com/blog/?p=43

 

用過gcc的都知道gcc有許多參數。例如要將hello.c譯成hello.exe並加上調試信息,用gcc hello.c -g -o hello.exe即可。現在分析gcc的參數。對於這個例子,參數可分成三個部分:輸入文件(hello.c)、是否包含調試信息(-g)、輸出文件 (-o hello.exe)。這三個部分的次序是無關緊要的,例如可以確保,-o後面跟的一定表示輸出文件。

getopt是C語言標準庫中用來處理命令行參數的一個函數,其原型聲明在unistd.h文件中:
int getopt( int argc, char *const argv[], const char *optstring );

這裏最關鍵的參數是optstring這個字符串。假如我要做一個編譯器,僅僅支持-g -o參數,我需要把optstring設置爲”go:”,也就是把短線後的字母放在字符串裏。但別忘了o後面的冒號”:”,冒號指出在這個參數的後面還有一個相關參數。從目的上看-o後面要跟一個輸出文件名,否則是沒有意義的。optstring中的字母順序是任意的,本例中也可以寫成”o:g”。

getopt函數一個一個地處理命令行參數,當getopt返回-1時,表示所有的以短線標識的參數都已經處理完畢。因此通常使用一個循環來反覆調用getopt,並在循環裏面用一個switch語句來處理不同的參數。先看一下完整的程序:

注意到當處理-o參數時,用了globalOpt.output=optarg。optarg是getopt引入的一個全局變量,如果一個選項後面跟一個參數的話,optarg就是這個參數的值。對於本例來說optarg就是-o後面的輸出文件名。循環的外面還有一句 globalOpt.input=argv[optind],這是用來獲取輸入文件名的。因爲在這個例子中,前面不加選項參數的被認爲是輸入文件(gcc 也是這樣設計的),無法用getopt來解析。這裏用到了optind這個全局變量,它表示再次調用getopt()時的下一個argv指針的索引。本例中,它將指向輸入文件名參數的位置。

將以上程序編譯成mygcc.exe,在命令行下運行:mygcc -o hello.exe hello.c -g,將顯示:

Debug: 1
Input: hello.c
Output: hello.exe

 

發佈了10 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章