8

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

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

5 回答 5

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,您只需将它们存储一次,而无需在所有不同的函数之间不断传递它们。

于 2012-10-12T15:55:45.963 回答
4

只要可行,就应该遵守标准。因此,不要写

void main

这从来都不是有效的 C 或 C++,而是写

int main

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

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

因此,对于 Windows,您最好使用GetCommandLineAPI 函数及其姊妹解析函数。为了可移植性,这应该更好地封装在一些命令行参数模块中。wchar_t然后你需要处理在 Windows 和char*nix中使用的有趣问题......

无论如何,我不确定对应的 *nix API,或者即使有,但谷歌它。在最坏的情况下,对于 *nix,您始终可以从main. *nix 的丑陋直接源于需要使用 C++ 最不可移植的、特定于操作系统的构造(即 standard )来支持可移植性main

于 2012-10-12T16:16:45.257 回答
2

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

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

于 2012-10-12T15:54:54.067 回答
0

查看“ getoptlong ”系列函数和库。这些提供了一种结构化的方式来定义您的程序期望的参数,然后可以很容易地为您解析它们。还可以帮助生成文档/帮助响应。

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

于 2015-08-13T23:22:16.870 回答
0

Linux 提供program_invocation_nameprogram_invocation_name_short.

于 2018-09-27T20:58:11.060 回答