我正在查找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中的一个常见功能,但我一直在谷歌搜索几个小时,我不知道我要找的名字。任何解释都会很好。
答案 0 :(得分:3)
该术语是“全局变量”。如果在函数外部声明变量,则可以在函数内部访问:
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)。
答案 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)