我在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循环中打印选项名称并显示给用户。实现这一目标的最佳方法是什么?任何人都可以提供指导或输入吗?
答案 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::string
与char *
进行狡辩。)
对于错误检测,标准getopt()
有变量optopt
和opterr
来提供帮助。 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.
}