как назначить argc и argv глобальным переменным? - PullRequest
0 голосов
/ 19 апреля 2019

В основном я хочу передать argc и *argv[] main глобальным переменным, но получаю:

ошибка: args имеет неполный тип char *[];

код:

int argi;
char *args[];

int main(int argc, char *argv[]){
    argi = argc;
    args = argv;
    // blah bah blah
}

int foo(){
    printf("argv[0]: %s\n", args[0]);
    // ayy what it is.
}

Примечание: по какой-то причине я не хочу делать foo(int argc, char *argv[]), а затем в основном вызывать его как foo(argc, argv);

Так точносказал, что мне нужно присвоить main * argc и argv моим глобальным переменным.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2019

Массивы и указатели не полностью эквивалентны, даже если они часто кажутся конвертируемыми.Используйте char **argv вместо char *argv[] (и то же самое для глобального), и тогда это будет работать.

0 голосов
/ 19 апреля 2019

Существует 1 проблема:

  1. Тип массива argv довольно ограничен в управлении параметрами программы.

Следовательно, лучшая практика всегда заключается в использовании указателя массива аргументов argv без изменения его структуры данных: char **argv.

Таким образом,Вы можете легко передать или использовать массив в своих исходных кодах.


Вот краткий пример (протестирован с gcc, amd64 в ОС Debian), полученный из ваших фрагментов кода:

#include <stdio.h>

int argi;
char **args;

int foo(void) {
    int i;

    for (i=0; i<argi; i++) {
        printf("argv[%d]: %s\n", i, args[i]);
    }
    printf("\n");
    return 0;
}

int main(int argc, char **argv) {
    argi = argc;
    args = argv;
    return foo();
}

Если вы скомпилируете и запустите, вы должны получить следующее:

u0:demo$ ./a.out 
argv[0]: ./a.out

u0:demo$ ./a.out one
argv[0]: ./a.out
argv[1]: one

u0:demo$ ./a.out one two
argv[0]: ./a.out
argv[1]: one
argv[2]: two

u0:demo$ ./a.out one two three
argv[0]: ./a.out
argv[1]: one
argv[2]: two
argv[3]: three

u0:demo$

ОБНОВЛЕНИЕ

Fri Apr 19 16:46:05 +08 2019:

  • устранена проблема «указатель строки», поскольку она была недопустимой, поскольку указатель строки указателя строки представлен char *variable, а не char *variable[].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...