Странно вне области видимости - PullRequest
4 голосов
/ 17 марта 2012

Я искал команду getopt и обнаружил, что использование функции, кажется, необъяснимым образом создает другую переменную с именем optarg.Вы можете увидеть пример этого в следующей программе, которую я пролистал из Википедии:

#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include <unistd.h>    /* for getopt */
int main (int argc, char **argv) {
    int c;
    int digit_optind = 0;
    int aopt = 0, bopt = 0;
    char *copt = 0, *dopt = 0;
    while ( (c = getopt(argc, argv, "abc:d:012")) != -1) {
        int this_option_optind = optind ? optind : 1;
        switch (c) {
        case '0':
        case '1':
        case '2':
            if (digit_optind != 0 && digit_optind != this_option_optind)
              printf ("digits occur in two different argv-elements.\n");
            digit_optind = this_option_optind;
            printf ("option %c\n", c);
            break;
        case 'a':
            printf ("option a\n");
            aopt = 1;
            break;
        case 'b':
            printf ("option b\n");
            bopt = 1;
            break;
        case 'c':
            printf ("option c with value '%s'\n", optarg);
            copt = optarg;
            break;
        case 'd':
            printf ("option d with value '%s'\n", optarg);
            dopt = optarg;
            break;
        case '?':
            break;
        default:
            printf ("?? getopt returned character code 0%o ??\n", c);
        }
    }
    if (optind < argc) {
        printf ("non-option ARGV-elements: ");
        while (optind < argc)
            printf ("%s ", argv[optind++]);
        printf ("\n");
    }
    exit (0);
}

Обратите внимание, что optarg теперь используется, по-видимому, без объявления или инициализации.Может быть, это обычная особенность C, о которой я не знаю, но я уже несколько часов гуглю и не знаю названия того, что ищу.Любые объяснения были бы хорошими.

Ответы [ 5 ]

3 голосов
/ 17 марта 2012

Термин «глобальная переменная».Если вы объявляете переменную вне функции, она доступна внутри функций:

int i = 7;

int main()
{
    printf("%d\n", i); // prints 7
    return 0;
}

В случае optarg заголовок unistd.h объявляет ее как глобальную переменную char * с внешней связью:

extern char *optarg;

(см. http://pubs.opengroup.org/onlinepubs/000095399/functions/getopt.html).

2 голосов
/ 17 марта 2012

со страницы руководства

GETOPT(3)                BSD Library Functions Manual                GETOPT(3)

NAME
     getopt -- get option character from command line argument list

LIBRARY  
     Standard C Library (libc, -lc)  

SYNOPSIS  
     #include <unistd.h>  

     extern char *optarg;  
     extern int optind;  
     extern int optopt;  
     extern int opterr;  
     extern int optreset;  

     int  
     getopt(int argc, char * const argv[], const char *optstring);

Эти переменные объявлены в заголовочном файле unistd.h.

1 голос
/ 17 марта 2012

Для дальнейшего использования, если вы найдете имена, но не знаете, где они определены или объявлены, запустите только препроцессор C, который отвечает за #include, а затем найдите термин, используя grep илипросто more.

Например,

gcc -E foo.c >foo.i

поместит результат препроцессора C в foo.i

Затем вы можете взглянуть нафайл, используя больше (используя / для поиска)

Файл будет содержать ссылки на включаемый файл, который содержит определение или объявление.

Например,more foo.iзатем/optargпоказывает линиюextern char *optarg;прокручивая вверх (или обратный поиск ?#), я мог найти# 414 "/usr/include/unistd.h" 3 4

0 голосов
/ 17 марта 2012

- Переменная: char * optarg

Эта переменная устанавливается getopt, чтобы указывать на значение аргумента опции, для тех опций, которые принимают аргументы.

Я нахожу это на Используя Getopt Веб-сайт

0 голосов
/ 17 марта 2012

optarg объявлено в <unistd.h>.

...