Как получить доступ к argv [] извне функции main ()? - PullRequest
9 голосов
/ 30 октября 2010

У меня есть несколько функций, которые получают доступ к различным аргументам программы через массив argv[].В настоящее время эти функции вложены в функцию main() из-за языкового расширения, которое компилятор предоставляет для таких структур.

Я хотел бы избавиться от вложенных функций, чтобы обеспечить совместимость без зависимости отрасширение языка.

Прежде всего я подумал о указателе массива, на который я бы указывал argv[] после запуска программы, эта переменная находилась бы вне функции main() и объявлялась перед функциями так, чтобыон может быть использован ими.

Поэтому я объявил такой указатель следующим образом:

char *(*name)[];

, который должен быть указателем на массив указателей на символы.Однако, когда я пытаюсь указать на argv[], я получаю предупреждение о назначении от несовместимого типа указателя:

name = &argv;

В чем может быть проблема?Думаете ли вы о другом способе доступа к массиву argv[] вне функции main()?

Ответы [ 3 ]

6 голосов
/ 30 октября 2010
char ** name;
...
name = argv;

сделает свое дело:)

вы видите char *(*name) [] - указатель на массив указателей на символ. В то время как аргумент вашей функции argv имеет указатель типа на указатель на символ, и поэтому & argv имеет указатель типа на указатель на указатель на символ. Зачем? Потому что, когда вы объявляете функцию для получения массива, для компилятора она совпадает с функцией, принимающей указатель. То есть

void f(char* a[]);
void f(char** a);
void f(char* a[4]);

- абсолютно идентичные эквивалентные объявления. Не то, чтобы массив был указателем, но как аргумент функции это

НТН

3 голосов
/ 30 октября 2010

Это должно работать,

char **global_argv;


int f(){
 printf("%s\n", global_argv[0]); 
}

int main(int argc, char *argv[]){
  global_argv = argv;
 f(); 
}
0 голосов
/ 30 октября 2010
#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);
}
...