2010-09-30 117 views
4

有沒有一種真正有效的方法來處理C++中的命令行參數?在C++中解析命令行參數的有效方法是什麼?

我在下面做的事完全是業餘的,我無法想象這是命令行參數如何在專業軟件中真正處理(atoi,硬編碼argc檢查)。

 
// Command line usage: sum num1 num2 

int main(int argc, char *argv[]) 
{ 
   if (argc < 3) 
   { 
      cout << "Usage: " << argv[0] << " num1 num2\n"; 
      exit(1); 
   }
   int a = atoi(argv[1]);    int b = atoi(argv[2]);    int sum = a + b;
   cout << "Sum: " << sum << "\n";
   return 0; }
+0

我認爲NUnit的源代碼(C#)具有命令行處理類的一個很好的例子.... [選項的 – 2010-09-30 00:35:32

+1

可能重複解析器爲c/C++?](http://stackoverflow.com/questions/637371/option-parsers-for-cc) – wilhelmtell 2010-09-30 00:41:20

+0

對於上面的例子,它是完美的。我不會做任何更復雜的事情。現在,如果你正在做一些像gcc那樣的有幾千個標誌的圖書館,那麼圖書館可能會很有用,但是如果需要另一個則完全取決於情況。 – 2010-09-30 02:26:45

回答

16

您可能想爲此使用外部庫。有很多可供選擇。

Boost具有非常豐富的功能(如往常一樣)庫Boost Program Options

我個人最近幾年的最愛是TCLAP--純粹是模板化的,因此沒有圖書館或鏈接,自動化的「幫助」一代和其他好東西。請參閱文檔中的simplest example

+0

+1,不知道tclap,它設法輕量級,但感覺完整,我肯定會深入研究。 – 2010-09-30 06:33:56

2

,如果這是LINUX/UNIX那麼標準的一個使用的是GNU getopt的

http://www.gnu.org/s/libc/manual/html_node/Getopt.html

+0

不是真正的問題是關於C++,Getopt只是普通的C.過去有一個C++變體,但由於某種原因它被撤銷了。 – 2010-09-30 00:52:39

+1

它在C++ tho中正常工作;它是我們在我們所有的C++代碼中使用的。 – pm100 2010-09-30 01:04:46

+0

好的,但你可以用例如TCLAP。我使用新的選項定義添加或刪除一行,並且我不需要在其他地方編輯代碼 - >在老派getopt中不是這樣。 – 2010-09-30 01:51:56

0

我使用Windows下的getopt()/ MinGW的:

while ((c = getopt(myargc, myargv, "vp:d:rcx")) != -1) { 
     switch (c) { 
     case 'v': // print version 
      printf("%s Version %s\n", myargv[0], VERSION); 
      exit(0); 
      break; 
     case 'p': // change local port to listen to 
      strncpy(g_portnum, optarg, 10); 
      break; 
...