Как получить доступ к argv[] вне функции main()?
-
27-09-2019 - |
Вопрос
У меня есть несколько функций, которые обращаются к различным аргументам программы через argv[]
множество.Прямо сейчас эти функции вложены внутри main()
функция из-за расширения языка, предоставляемого компилятором, позволяющего использовать такие структуры.
Я хотел бы избавиться от вложенных функций, чтобы обеспечить совместимость без зависимости от расширения языка.
Прежде всего я подумал об указателе массива, на который я бы указал. argv[]
после запуска программы эта переменная окажется за пределами main()
функцию и объявляется перед функциями, чтобы они могли ее использовать.
Поэтому я объявил такой указатель следующим образом:
char *(*name)[];
Это должен быть указатель на массив указателей на символы.Однако, когда я пытаюсь указать на это argv[]
Я получаю предупреждение о назначении несовместимого типа указателя:
name = &argv;
В чем может быть проблема?Вы думаете о другом способе доступа к argv[]
массив снаружи main()
функция?
Решение
char ** name;
...
name = argv;
сделаю свое дело :)
Понимаете char *(*name) []
является указателем на массив указателей на char.В то время как аргумент вашей функции argv имеет указатель типа на указатель на char, и, следовательно, &argv имеет указатель типа на указатель на указатель на char.Почему?Потому что когда вы объявляете функцию, принимающую массив, для компилятора это то же самое, что и функция, принимающая указатель.То есть,
void f(char* a[]);
void f(char** a);
void f(char* a[4]);
являются абсолютно идентичными эквивалентными объявлениями.Не то, чтобы массив был указателем, но как аргумент функции он
ХТХ
Другие советы
Это должно сработать,
char **global_argv;
int f(){
printf("%s\n", global_argv[0]);
}
int main(int argc, char *argv[]){
global_argv = argv;
f();
}
#include <stdio.h>
int foo(int pArgc, char **pArgv);
int foo(int pArgc, char **pArgv) {
int argIdx;
/* do stuff with pArgv[] elements, e.g. */
for (argIdx = 0; argIdx < pArgc; argIdx++)
fprintf(stderr, "%s\n", pArgv[argIdx]);
return 0;
}
int main(int argc, char **argv) {
foo(argc, argv);
}