Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将命令行参数传递给子函数_C_Command Line_Command Line Arguments - Fatal编程技术网

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行参数检查特定的局部变量(并采取相应的进一步

我有一个C程序主程序,它调用了几个层次的函数。例如:

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