如何在其他函数中使用cmd传递参数?

问题描述:

我们作为如何在其他函数中使用cmd传递参数?

int main(int argc, char *argv[]) 

声明的main(),并通过命令行传递一些参数和使用它

argv[1]argv[2]在main()函数的定义,但如果我想使用一些其他的什么函数的定义?

我可以做的一件事总是通过参数从main()传递那个指针char** argv到那个函数。但是有没有其他方法可以这样做?

+1

我真的不明白,你想问什么。 – datenwolf 2012-01-02 11:08:06

为了使数据提供给其他的功能,你需要把它作为参数传递,或使其可通过全球(不推荐)或者一个静态变量。

static char** args cmd_args; 
static int cmd_arg_count; 

int main(int argc, char** argv) { 
    cmd_arg_count = argc; 
    cmd_args = argv; 
    do_work(); 
    return 0; 
} 

void do_work() { 
    if (cmd_args > 1) { 
     printf("'%s'\n", cmd_args[1]); 
    } 
} 

最好的办法是使解析命令行参数的函数,并存储在您为代表的命令行参数的目的专门定义struct结果。然后你可以传递这个结构,或者静态或全局地使用它(再次,使用全局变量几乎是个不错的主意)。

+0

哦,这是我一直在寻找的感谢。 – 2012-01-02 11:15:45

+0

仅仅通过指针是更好的恕我直言,除非在整个程序执行过程中数据必须可用 – 2012-01-02 11:22:09

+0

@MatthiasvanderVlies在C中,它提供封装的方法有限,我认为使用'static'变量是可以的:它们不会“泄漏”过编制单位,所以潜在的损害范围非常有限。 – dasblinkenlight 2012-01-02 11:30:57

只要通过指针?

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

void do_something_with_params(char** argv) { 
    // do something 
} 

或者,如果你的意思是通过单一的参数:

int main(int argc, char** argv) { 
    do_something_with_argv1(argv[1]); 
    do_something_with_argv2(argv[2]); 
} 

void do_something_with_argv1(char* arg) { 
    // do something 
} 

void do_something_with_argv2(char* arg) { 
    // do something 
} 

您可以使用main()中的代码将值存储在非局部变量中,然后从其他函数中引用这些变量。

如果你真的需要,将它们存储在全局变量中。

但如果我想在其他函数的定义中使用它,该怎么办?

你的意思是有主要另一组的参数?这是不可能的,因为主要在C标准被定义为

int main(); 

int main(int, char*[]); 

它是有道理的:第一个参数告诉你在命令行上给出的参数个数第二个包含指向这些参数的指针数组。

您有责任理解这些参数并将它们传递给其他功能。使用字符串转换函数,如果你需要使他们的数字。

我可以做的一件事情总是通过参数将这个值从main()传递给该函数。但是有没有其他方法可以这样做?

不会。将argcargv传递给其他函数是完全有效的。

int main(int argc, char *argv[]) 
{ 
    typedef struct _cmdline_arg_struct { 
     // all your command line arguments go here 
    }cmdline_arg_struct; 

    /* command line arguments - parsed */ 
    cmdline_arg_struct *pc = (cmdline_arg_struct *) malloc(sizeof(cmdline_arg_struct)); 

    if (parse_cmdline_args(&pc, argc, argv) == PARSE_FAILURE) { 
     usage(); 
     return 0; 
    } 

    /* Now go through the structure and do what ever you wanted to do.. *? 
}