我有一个C程序主程序,可以在几个级别的函数中调用它。例如:
main -> MyFunc -> MySubFunc -> MySub2Func
我在MySub2Func中有一个条件需要根据命令行参数进行检查。例如:
if (myvar == argv[1])
除了将argv作为参数传递给子函数之外,还有其他方法可以实现这一点。 (因为我需要在不同的层次级别的几个函数中执行此操作)
每个子功能都位于不同的C文件中。我的目的是通过临时检查cmd行参数的特定局部变量来执行调试(并相应地采取进一步的操作)。因此,遗憾的是修改整个层次并不适合我的目的。
[评论更新]
抱歉,我忘了提..我试图通过临时检查一个特定的局部变量对一个cmd行参数执行调试(并采取相应的进一步操作)..因此修改整个层次很遗憾不适合我的目的..答案 0 :(得分:2)
常见的方法是" decouple"他们俩;调用树下面的函数真的不应该关心或了解main()
的参数,即命令参数向量本身。
相反,它应该被抽象为特定于应用程序的选项,这些选项从main()
传递,它将选项从命令行参数解析为所有需要它们的特定于应用程序的函数。
答案 1 :(得分:2)
您可以使用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();
}
}
答案 2 :(得分:0)
正如放松所说,链条下游的功能应该对主要论点一无所知。一旦设置了程序的配置,就应该解析命令行参数。此外,您应该为此配置提供查询功能,例如
/* --- 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_enabled()
等曝光。
答案 3 :(得分:0)
[用于调试]
将其放入所有相关模块所包含的标题中:
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
。