2013-09-26 42 views
1

我試圖理解一個類的一段骨架代碼。預期的用法是:C,getopt()如何更新

./a.out -d -n Foo -i Bar 

骨架代碼工作正常,但我從來沒有使用getopt()並不能明白爲什麼它工作正常(理解它沒有任何關係與分配,我只是想感覺)。它如何更新/退出while循環?我沒有看到一個指針遞增,或者循環中傳遞給它的參數根本不會改變。

char *optString = "-d-n:-i:"; 
int opt = getopt(argc, argv, optString); 

while (opt != -1) { 
    switch(opt) { 
    case 'd': 
     debug = 1; 
     break; 
    case 'n': 
     nameserver_flag = 1; 
     nameserver = optarg; 
     break; 
    case 'i': 
     hostname = optarg; 
     break; 
    case '?': 
     usage(); 
     exit(1); 
    default: 
     usage(); 
     exit(1); 
    } 
    opt = getopt(argc, argv, optString); 
} 
+0

提供'getopt'的libc是免費軟件。如果你想詳細瞭解它的工作原理,只需研究源代碼即可。你也可以使用'argp'函數。 –

+0

請參閱GNU libc的[getopt.c](https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=posix/getopt.c;hb=HEAD)。 –

+0

@BasileStarynkevitch,謝謝你,幫助我們瞭解它爲什麼有效。它看起來像'optarg'是隱藏索引 – asimes

回答

2

getopt使用全局變量來存儲參數索引,下一個字符解析和一些其他信息。每次您撥打getopt時,函數會檢查這些變量,以瞭解它最後的位置(或您告訴它的位置)並更新下次調用的變量。

最重要的是,optind存儲要掃描的下一個元素的argv中的索引。

2

每次調用getopt都會在argv中處理另一個參數,並將結果返回到opt等等。還有什麼需要了解的?

+0

它在while循環中的參數不會以任何可見的方式更新 – asimes

+0

是的,argv不會改變。 getopt維護一個你看不到的變量,包含在頭文件中。然而,opt會改變,這就是你的switch語句的工作原理。有關詳細信息,請參閱「man getopt」。 –