使用getopt() 、getopt_long()、getopt_long_only()进行命令行处理
复杂命令行处理: getopt_long() 在 20 世纪 90 年代(如果没有记错的话),UNIX 应用程序开始支持长选项,即一对短横线(而不是普通短 选项所使用的单个短横线)、一个描述性选项名称还可以包含一个使用等号连接到选项的参数。 幸运的是,可以通过使用 getopt_long() 向程序添加长选项支持。您可能已经猜到了,getopt_long() 是同时支持长选项和短选项的getopt() 版本。 getopt_long() 函数还接受其他参数,其中一个是指向 struct option 对象数组的指针。此结构相当直接,如清单 10 中所示。 清单 10. getopt_long() 的选项 struct option { char *name; int has_arg; int *flag; int val; }; name 成员是指向长选项名称(带两个短横线)的指针。has_arg 成员设置为 no_argument、optional_argument, 或required_argument(均在 getopt.h 中定义)之一,以指示选项是否具有参数。如果 flag 成员未设置为 NULL,在处理期间遇到此选项时,会使用 val 成员的值填充它所指向的 int 值。如果 flag 成员为 NULL,在 getopt_long() 遇到此选项时,将返回 val 中的值;通过将 val 设置为选项的 short 参数,可以在不添加任何其他代码的情况下使用 getopt_long()——处理 while loop 和 switch 的现有 getopt() 将自动处理此选项。 这已经变得更为灵活了,因为各个选项现在可以具有可选参数了。更重要的是,仅需要进行很少的工作,就可以方便地放入现有代码中。 让我们看看如何使用 getopt_long() 来对示例程序进行更改(getopt_long_demo 项目可从下载部分获得)。 使用 getopt_long() 由于 getopt_long_demo 几乎与刚刚讨论的 getopt_demo 代码一样,因此我将仅对更改的代码进行说明。由于现在已经有了更大的灵活性,因此还将添加对 --randomize 选项(没有对应的短选项)的支持。 getopt_long() 函数在 getopt.h 头文件(而非 unistd.h)中,因此将需要将该头文件包含进来(请参见清单 11)。我还包含了string.h,因为将稍后使用 strcmp() 来帮助确定处理的是哪个长参数。 清单 11. 其他头文件 #include <getopt.h> #include <string.h> (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |