C 将命令行参数传递给子函数
我有一个C程序主程序,它调用了几个层次的函数。例如:C 将命令行参数传递给子函数,c,command-line,command-line-arguments,C,Command Line,Command Line Arguments,我有一个C程序主程序,它调用了几个层次的函数。例如: main -> MyFunc -> MySubFunc -> MySub2Func 我在MySub2Func中有一个条件,需要对照命令行参数进行检查。例如: if (myvar == argv[1]) 除了将argv作为参数传递给子函数之外,还有其他方法可以实现这一点吗。(因为我需要在不同层级的多个函数中执行此操作) 每个子函数位于不同的C文件中。我的目标是通过临时根据cmd行参数检查特定的局部变量(并采取相应的进一步
main -> MyFunc -> MySubFunc -> MySub2Func
我在MySub2Func中有一个条件,需要对照命令行参数进行检查。例如:
if (myvar == argv[1])
除了将argv作为参数传递给子函数之外,还有其他方法可以实现这一点吗。(因为我需要在不同层级的多个函数中执行此操作)
每个子函数位于不同的C文件中。我的目标是通过临时根据cmd行参数检查特定的局部变量(并采取相应的进一步措施)来执行调试。。因此,不幸的是,修改整个继承权对我来说是不可取的
[评论更新]
对不起,我忘了提。。我试图通过临时检查cmd行参数中的特定局部变量来执行调试(并采取相应的进一步措施)。。因此,不幸的是,为了我的目的,修改整个继承权是不可取的。常用的方法是“两者”;调用树后面的函数实际上不应该关心或知道
main()
的参数,即命令参数向量本身
相反,它应该被抽象为特定于应用程序的选项,这些选项是从main()
传递的,后者将选项从命令行参数解析出来,一直传递到所有需要它们的特定于应用程序的函数;调用树后面的函数实际上不应该关心或知道main()
的参数,即命令参数向量本身
相反,它应该被抽象为特定于应用程序的选项,这些选项是从
main()
传递来的,后者将选项从命令行参数解析出来,一直传递到所有需要它们的特定于应用程序的函数。您可以使用在main()
函数中设置的全局变量:
int g_argc;
char **g_argv;
int main(int argc, char **argv) {
g_argc = argc;
g_argv = argv;
MyFunc();
}
...
void MyFunc() {
MySubFunc();
}
...
void MySubFunc() {
MySub2Func();
}
...
void MySub2Func() {
if (myvar == g_argv[1]) {
do_the_thing();
}
}
您可以使用在
main()
函数中设置的全局变量:
int g_argc;
char **g_argv;
int main(int argc, char **argv) {
g_argc = argc;
g_argv = argv;
MyFunc();
}
...
void MyFunc() {
MySubFunc();
}
...
void MySubFunc() {
MySub2Func();
}
...
void MySub2Func() {
if (myvar == g_argv[1]) {
do_the_thing();
}
}
正如unwind所说,链下游的函数实际上不应该知道main的参数。设置程序配置后,应解析命令行参数。此外,您还应为此配置提供查询功能,例如
/* --- config.c */
typedef struct {
int debug_enabled;
} config_t;
static config_t configuration;
int debug_enabled() {
return configuration->debug_enabled;
}
void initialize_config() {
/* set default parameters */
}
int set_config_from_cmd(int argc, char** argv){
/* parse CMD parameters and set config */
}
/* --- main.c */
int main(int argc, char** argv)
{
initialize_config();
if ( set_config_from_cmd(argc, argv) == -1 ) {
exit(-1);
}
/* do stuff, call functions */
}
int myfunction() {
if ( debug_enabled() ) {
printf("debug!");
}
/* do stuff */
}
注意,为了隐藏配置结构的内部内容,我将配置相关的内容放在一个单独的文件中。只有接口(例如,
debug\u enabled()
等)是公开的。正如unwind所说,链下游的函数实际上不应该知道main参数的任何信息。设置程序配置后,应解析命令行参数。此外,您还应为此配置提供查询功能,例如
/* --- config.c */
typedef struct {
int debug_enabled;
} config_t;
static config_t configuration;
int debug_enabled() {
return configuration->debug_enabled;
}
void initialize_config() {
/* set default parameters */
}
int set_config_from_cmd(int argc, char** argv){
/* parse CMD parameters and set config */
}
/* --- main.c */
int main(int argc, char** argv)
{
initialize_config();
if ( set_config_from_cmd(argc, argv) == -1 ) {
exit(-1);
}
/* do stuff, call functions */
}
int myfunction() {
if ( debug_enabled() ) {
printf("debug!");
}
/* do stuff */
}
注意,为了隐藏配置结构的内部内容,我将配置相关的内容放在一个单独的文件中。仅显示接口,例如debug\u enabled()
等。[用于调试]
将其放入所有相关模块包含的标题中:
extern int g_argc;
extern char ** g_argv;
在主模块中全局定义g_argc
和g_argv
int g_argc = 0;
char ** g_argv = NULL;
然后在main()
int main(int argv, char ** argv)
{
g_argc = argc;
g_argv = argv;
并从相关模块访问g_argc
和g_argv
。[用于调试]
将其放入所有相关模块包含的标题中:
extern int g_argc;
extern char ** g_argv;
在主模块中全局定义g_argc
和g_argv
int g_argc = 0;
char ** g_argv = NULL;
然后在main()
int main(int argv, char ** argv)
{
g_argc = argc;
g_argv = argv;
并从相关模块访问g_argc
和g_argv
。全局变量是选项吗?可能重复:全局变量是选项吗?可能重复:抱歉,我忘了提及。。我试图通过临时检查cmd行参数中的特定局部变量来执行调试(并采取相应的进一步措施)。。因此,不幸的是,修改整个继承权对我来说是不可取的1.对不起,我忘了提。。我试图通过临时检查cmd行参数中的特定局部变量来执行调试(并采取相应的进一步措施)。。因此,不幸的是,为了我的目的,修改整个继承权是不可取的..谢谢。。我试过你的建议,它看起来和我要找的简单黑客一模一样。。visual studio在编译时发出“未解析的外部”错误(当我在子程序文件中的外部声明中执行“转到定义”时,它会将我带到主函数声明!)您是否执行了完整重建,即第一次执行“清理项目”,然后执行“生成项目”@USER3698698是的,我执行了重建:-主功能和子功能位于不同的模块中。。这会有什么不同吗?您是否在全局范围内定义了g_argc
和g_argv
,这不是在main()
函数中,而是在函数外部@user3698698yes g_argv是全局定义的(在主服务器外部)。。我不需要argc,因此没有使用g_argcthanks。。我试过你的建议,它看起来和我要找的简单黑客一模一样。。visual studio在编译时发出“未解析的外部”错误(当我在子程序文件中的外部声明中执行“转到定义”时,它会将我带到主函数声明!)您是否执行了完整重建,即第一次执行“清理项目”,然后执行“生成项目”@USER3698698是的,我执行了重建:-主功能和子功能位于不同的模块中。。这会有什么不同吗?您是否在全局范围内定义了g_argc
和g_argv
,这不是在main()
函数中,而是在函数外部@user3698698yes g_argv是全局定义的(在主服务器外部)。。我不需要argc,因此没有使用g_argc