2011-04-05 118 views
2

我正在C++中實現項目特定的「getopt」。爲此,我實現了一個類,看起來像這樣:「?」在C++中實現簡單的getopt

class MyGetOptions { 
private: 
    typedef std::map<std::string, bool> optionsTbl; 
    optionsTbl m_optionsTbl; 
    int   m_currentArg; 

    // Prohibit copy and assignment. 
    MyGetOptions (const MyGetOptions &); 
    void operator= (const MyGetOptions &); 

public: 
    MyGetOptions(); 
    inline bool addOption(std::string option, bool isArgReq); 
    int getOpt(int argc, char *argv[], std::string& option, std::string& optArg); 

    // Debug functions. 
    void printOptionTbl(); 
}; 
由供應商上述類

現在使用看起來如下

MyGetOptions myOpts; 
    myOpts.addOption("myName", true); 
    myOpts.addOption("mySettings", false); 

    std::string optArg; 
    std::string option; 

    while((myOpts.getOpt(argc, argv, option, optArg)) != -1) 
    { 
     if(option.compare("myName") == 0) 
     { 
      std::cout << "The myName option is set and value is " << optArg << std::endl; 
      continue; 
     } 
     // ... additional options. 

     else if(option.compare("?") == 0) 
     { 
      // print help and exit. 
     } 
     else 
     { 
      // print help and exist. 
     } 
    } 

在本設計中,我回國標記getOpt是否在argv中找到未註冊的選項字符,或者是否檢測到缺少選項參數。如果所有命令行選項都已解析,則getOpt返回-1。

我想區分何時返回?是否提供argv未提供註冊或缺少選項參數提供,還希望在while循環中打印選項名稱並向用戶顯示。什麼是最好的方式來實現這一目標?任何人都可以提供指導或輸入嗎?

+1

你爲什麼要重新發明輪子? http://www.boost.org/doc/libs/1_46_1/doc/html/program_options.html http://www.chemie.fu-berlin.de/chemnet/use/info/libgpp/libgpp_39.html http: //code.google.com/p/getoptpp/ ... – 2011-04-05 04:21:54

+4

由於初學輪修者需要練習製作輪子,因此不應在創建基本輪子之前創建精心設計的新設計。 – 2011-04-05 04:25:15

回答

0

而不是使用全局變量,我更喜歡結合「?」使用返回值。像如下

else if ((option.compare("?") == 0) && (getOptStatus == 0)) 
{ 
    // if ? and return value 0 means finds a string in argv that is not 
    // registered with add options. 
    continue; 
} 
else if ((option.compare("?") == 0) && (getOptStatus == 1)) 
{ 
    // if ? and return value 1 means finds an option string 
    // with missing option argument. 
    // print help and exit. 
} 
0

getopt()的標準設計是否返回它找到的選項字母,或者返回?出錯。你會捕捉分配的選項字母在循環條件:

int opt; 
while ((opt = myOpts.getOpt(argc, argv, option, optArg)) != -1) 
{ 
    ...analyze the option returned... 
} 

標準getopt()有一個全局變量optarg指向參數; C++中的參考參數是一個更好的選擇(我們可能會對std::stringchar *進行比較)。

至於錯誤檢測,標準getopt()有變量optoptopterr來協助。 optopt包含觸發錯誤的選項字母。可以將opterr設置爲0以指示getopt()不應報告錯誤;默認情況下,它會爲您寫入一個錯誤到cerr。在C++中,你可以避免使用全局變量,但你可以使用一些額外的(私有)成員變量來記錄這些細節,並提供訪問函數來讓你找出發生了什麼。