-
- init_switch(opt->type)
- {
- . . . . . .
- case OPT_VALUE: /*一般是指短选项含有参数,此类型是含有参数为 1.
- longopt->has_arg = required_argumet;
- if (opt->short_name) /*如果短选项不为空*/
- *p++ = ';'; /*将":"添入char 类型short_options数组中*/
- break; /*其他返回*/
- case OPT_BOOLEN: /*这里是指的是长选项*/
- longopt->has_arg = optional_argument; /* # define optional_argument 2
- 此值定义为2,表示理想参数为 2*/
- longopt = &long_options[o++]; /*操作 long_options数组*/
- longopt->name = no_prefix (opt->long_name); /1、___---->main.c添入long_options数组的元素的域,no_prefix()表示加上"no-"表示没有*/
- longopt->has_arg = no_argument; /*没有参数 为 0*/
- longopt->val = i | BOOLEAN_NEG_MARKER; /*longopt->val的值为 一个大于1024的数作为是否出错判断*/
- break;
- default:
- assert (opt->argtype != -1); /*如果argtype不是 -1*/
- longopt->has_arg = opt->argtype; /*has_arg指向opt->argtype指向的地方*/
- if (opt->short_name) /*如果短选项不为 0*;
- {
- if (longopt->has_arg == required_argument)
- *p++ = ':'; /*如果参数为其他值,不要处理 optional_argument 的情况*/
- 384 /* Don't handle optional_argument */
- 385 }
- 386 }
- 387 }
- 388 /* Terminate short_options. */
- 389 *p = '\0'; /*在short_options数组中存放了一个" : "*/
- 390 /* No need for xzero(long_options[o]) because its storage is static
- 391 and it will be zeroed by default. */
- 392 assert (o <= countof (long_options)); /*循环的大小当然是小于总个数了*/
- 393 }
复制代码1、_________________------------------>
302 no_prefix (const char *s)
303 {
304 static char buffer[1024];
305 static char *p = buffer;
306
307 char *cp = p;
308 int size = 3 + strlen (s) + 1; /*看样子no- 和string不是在一起的。在options_tables[]中既可以看出 "no-STRING\0" 加上前面的"no-" 和 后面的 \0字符*/
309 if (p + size >= buffer + sizeof (buffer)) /*如果字符串地址大于了buffer数组的地址那么就abort()*/
310 abort ();
311
312 cp[0] = 'n', cp[1] = 'o', cp[2] = '-'; /*给前面这几个字符赋值*/
313 strcpy (cp + 3, s); /*然后copy*/
314 p += size; /*用p记录当前使用的最后位置即为\0后面第一个字符位置*/
315 return cp; /*返回字符初始地址*/
316 }
阅读(2444) | 评论(0) | 转发(0) |