奇怪的超出范围变量

时间:2012-03-16 23:58:47

标签: c variables scope arguments

我正在查找getopt命令,我发现使用该函数似乎莫名其妙地产生了另一个名为optarg的变量。您可以看到此in the following program I swiped from Wikipedia:

的示例
#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 个答案:

答案 0 :(得分:3)

该术语是“全局变量”。如果在函数外部声明变量,则可以在函数内部访问:

int i = 7;

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

对于optargunistd.h标头将其声明为具有外部链接的全局char *变量:

extern char *optarg;

(见http://pubs.opengroup.org/onlinepubs/000095399/functions/getopt.html)。

答案 1 :(得分:2)

来自手册页

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头文件中声明。

答案 2 :(得分:1)

为了将来参考,如果您找到名称但不知道它们的定义或声明位置,则只运行负责#include的C预处理器,然后使用{{}搜索该术语1}}或只是grep

例如

more

会将C预处理器的结果放入foo.i

然后,您可以使用更多(使用/搜索)

查看该文件

该文件将引用包含定义或声明的包含文件。

例如,
gcc -E foo.c >foo.i
然后
more foo.i
显示该行
/optarg
通过向上滚动(或反向搜索extern char *optarg;)我可以找到
?#

答案 3 :(得分:0)

optarg<unistd.h>中声明。

答案 4 :(得分:0)

- 变量:char * optarg

对于那些接受参数的选项,此变量由getopt设置为指向option参数的值。

我在Using Getopt网站

找到了这个