在main()之外处理argc和argv

时间:2012-10-12 15:53:08

标签: c++ parsing arguments argv argc

如果我想保留大部分用于处理命令行参数的代码(用于组织和更易读的代码),那么最好的方法是什么?

void main(int argc, char* argv[]){
    //lots of code here I would like to move elsewhere
}

5 个答案:

答案 0 :(得分:4)

将它们作为参数传递,或将它们存储在全局变量中。只要您不从main返回并尝试在atexit处理程序或全局范围内的对象的析构函数中处理它们,它们仍然存在并且可以从任何范围进行访问。

例如:

// Passing them as args:
void process_command_line(int argc, char **argv)
{
    // Use argc and argv
    ...
}

int main(int argc, char **argv)
{
    process_command_line(argc, argv);
    ...
}

可替换地:

// Global variables
int g_argc;
char **g_argv;

void process_command_line()
{
    // Use g_argc and g_argv
    ...
}

int main(int argc, char **argv)
{
    g_argc = argc;
    g_argv = argv;
    process_command_line();
    ...
}

将它们作为参数传递是一种更好的设计,因为它是封装的,如果您想要或者可以轻松地将程序转换为库,您可以修改/替换参数。全局变量更容易,因为如果你有许多不同的函数可以出于任何原因访问args,你可以只存储它们一次,而不需要在所有不同的函数之间传递它们。

答案 1 :(得分:3)

在任何可行的地方都应该遵守标准。因此,不要写

void main

从来没有有效的C或C ++,而是写

int main

这样,您的代码可以使用例如g ++(使用常用的编译器选项)。

鉴于void main我怀疑是Windows环境。无论如何,为了支持在Windows环境中使用您的程序,您不应该在Windows中使用main参数。他们在* nix工作,因为他们是为那个环境而设计的;它们通常不在Windows中工作,因为默认情况下(通过非常强的约定)它们被编码为Windows ANSI,这意味着它们不能使用用户当前语言环境之外的字符对文件名进行编码。

因此,对于Windows,您最好使用 GetCommandLine API函数及其姐妹解析功能。为了便于携带,最好将其封装在某些命令行参数模块中。然后你需要处理在Windows中使用wchar_t和在* nix中使用char的有趣问题...

无论如何,我不确定相应的* nix API,或者即使有一个,但谷歌它。在最坏的情况下,对于* nix,您始终可以从main初始化命令行参数模块。 * nix的丑陋直接源于需要使用C ++最不可移植的,特定于操作系统的构造支持可移植性,即标准main

答案 2 :(得分:2)

只需将argcargv作为您要处理它们的函数的参数传递。

void parse_arg(int argc, char *argv[]);

答案 3 :(得分:0)

查看“getoptlong”系列函数和库。它们提供了一种结构化的方法来定义程序所期望的参数,然后可以为您轻松解析它们。也可以帮助生成文档/帮助响应。

它是UNIX世界中的一个旧库,C#中也有一个.Net实现。 (+ Perl,Ruby,可能还有更多。很高兴能够在所有这些范例内使用单一范例!学习一次,随处使用!)

答案 4 :(得分:0)

Linux提供了program_invocation_nameprogram_invocation_name_short