GNU sed 源码重写日记-第一天 __STDC__ getopt_long 用法
第一天:
在sed.c文件头有
#ifdef __STDC__
#define VOID void#endif
查到wiki:
__STDC__
("standard c")宏可以被用来将代码分割为ANSI和K&R部分。
也就是说__STDC__没有被定义则表示遵从ANSI,否则不遵循
来源:http://zh.wikipedia.org/wiki/ANSI_C
并且说出: 最好改成 #if __STDC__ 更好。
我们平时使用的GCC 和 visual C++ 都支持ANSI C
之前只是用过getopt, sed源码中使用getopt_long很好,看了下用法,比较简单
argc,argv是main方法参数, optstring和getopt中定义一致, 需要定义一个option数组, 来表示长选项,
整个读选项还是使用getopt !=EOF 方式来做
/** * jeff学习sed源码练习 * * * file: sed.c * created: jeff * date: 2013.1.23 * ********************************************************************//** *__STDC__("standard c")宏可以被用来将代码分割为ANSI和K&R部分。 __STDC__ 被定义并是1,表示支持ANSI C */#if __STDC__#define VOID void#else#define VOID char#endif#include <stdio.h>#include <getopt.h>char *myname;static char *version_string="sed v1.18";static struct option longopts[]={ {"expression", 1, NULL, 'e'}, {"file", 1, NULL, 'f'}, {"quiet", 0, NULL, 'n'}, {"silent", 0, NULL, 'n'}, {"version", 0, NULL, 'V'}, {"help", 0, NULL, 'h'}, {NULL, 0, NULL, 0}};intmain (int argc, char** argv){ int opt; myname=argv[0]; /** * *获取参数, getopt_long * *int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); * * argc 来自main * argv 来自main * optstring: 可选项 hn 是无参数, ef是有参数并且可以紧跟也可以有空格隔开,V选项也是无参数 * struct option { * * const char *name; 长选项名称 * * int has_arg; 是否有参数, 0,1,2 无参,有参,可选 * * int *flag; NULL * * int val; short char * *}; * */ while( (opt =getopt_long (argc, argv, "hne:f:V", longopts, (int*)0))!= EOF) { switch(opt) { case 'n': break; case 'e': break; case 'f': break; case 'V': fprintf(stderr, "%s\n", version_string); break; case 'h': break; default: break; } } exit(0);}