2011-04-05 86 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++中,你可以避免使用全局变量,但你可以使用一些额外的(私有)成员变量来记录这些细节,并提供访问函数来让你找出发生了什么。