我試圖閱讀這個主題,但是當我嘗試運行我認爲是正確的事情時,它不會按照我希望的那樣做: )將命令行參數傳遞給我的程序的不同部分ANSI C
我有一個主程序,應該帶三個強制性參數,我們稱之爲t, p and s
。然後我有幾個模塊,作爲其初始化的一部分,也依賴於命令行參數。這些模塊有一個命令行參數,表示它們將被使用。
當我在我的主程序中構建我的可能的命令行選項字符串時,我使它看起來像t:p:s:
,我也循環所有模塊並請求其「觸發」選項字符。因此,完成的字符串可能看起來像t:p:s:iv
,其中i
和v
是兩個不同模塊的觸發器。
然後在while循環我這樣做(選項是上述字符串)
while ((opt = getopt(argc, argv, options)) != -1) {
switch (opt) {
case 't':
break;
case 's':
break;
case 'p':
break;
case 'h':
default:
ShowHelp(this, argc, argv);
exit(EXIT_FAILURE);
}
/*
* Check all available modules and see if options should be passed to it
*/
i = 0;
while((module = this->availablemodules[i++]) != NULL) {
if(opt == module->triggerArg) {
output = module->ParseOptions(module, argc, argv);
AddActiveModule(this, module);
}
}
}
的this->availablemodules
變量是指針現有模塊的一個NULL終止的陣列。正如你所看到的,我首先檢查主程序使用的選項,然後檢查給定的選項是否是模塊的觸發選項,在這種情況下,我發送要由該模塊解析的參數。
該模塊可能會反過來有一組不同的選項。所以輸入參數可能是這個樣子的
./myprog -t foo -s bar -p 10 -i -c 2 -v -c 1 -t bar
其中-i
和-v
是模塊「觸發」之後那些應該在處理模塊解析功能的選項。
我該如何最好地完成這項工作?我怎樣才能最好地處理這樣一個事實,即模塊觸發選項可能與主程序所需的一個選項相同(即,t:
既用作主程序中的一個選項,又用t
作爲模塊「觸發器」 )?是否有能力強制執行某些命令,還是必須在解析所有選項後手動檢查該命令?
首先我使用每個模塊的選項字符串構造主程序optionstring,但是如果一個模塊不被調用會混淆系統。
我希望一切都很清楚,但如果不只是要求......我對於如何處理這個問題有點困惑,所以可能無法很好地解釋它。
更新: 我剛剛讀了一些關於getopt_long和在想,這將有可能做這樣的事情與
./myprog -t foo -s bar -p 10 --module=module1 -c 2 --module=module2 -c 1 -t bar
,並有module1
和module2
是什麼識別模塊激活呢?或者它會混淆解析器多次使用--module
?
我不認爲'--module'會混淆解析器,但是您可能希望它的返回值(struct選項中的'int val')是一個不可打印的值,所以您不會限制一個可用的選項。另外,你可能希望--module設置輸入分析器的狀態,該分析器已初始化爲程序參數的狀態。或者,您可以僅使用'./myprog -t foo -s bar -p 10 --module1 -c = 2 --module1 -c = 1 --module2 -t = bar'形式的參數。你應該被警告,但getopt_long可能需要一個標誌來告訴它不要對argv進行排序,以便首先放置'-'和'--'。 – nategoose 2010-07-27 18:39:54