在C ++中简单的getopt实现

时间:2011-04-05 04:09:36

标签: c++

我在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.
        }
    }

在目前的设计中我回归“?”标记如果getOptargv中找到未注册的选项字符,或者它是否检测到缺少选项参数。如果已解析所有命令行选项,则getOpt将返回-1。

我想区分何时返回?是否提供了argv未注册或缺少选项参数,还想在while循环中打印选项名称并显示给用户。实现这一目标的最佳方法是什么?任何人都可以提供指导或输入吗?

3 个答案:

答案 0 :(得分:2)

之前已完成计划选项。除非你真的必须,否则不要重新发明。请考虑Boost.Program_options

答案 1 :(得分: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 ++中,你可以避免使用全局变量,但是你可以使用一些额外的(私有)成员变量来记录这些细节,并提供访问器函数来让你知道发生了什么。

答案 2 :(得分: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.
}