读书人

GNU sed 源码重写日记-第一天 _STDC_

发布时间: 2013-01-25 15:55:29 作者: rapoo

GNU sed 源码重写日记-第一天 __STDC__ getopt_long 用法

第一天:

在sed.c文件头有

#ifdef __STDC__

#define VOID void
#else
#define VOID char

#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);}


读书人网 >编程

热点推荐