图书馆有一个类似GNU的“Hello,World”样本项目吗?

时间:2010-11-15 03:41:11

标签: c gnu

GNU Hello是GNU的最佳实践,编码标准,国际化,配置自动化等的示例项目。

是否有针对图书馆的类似项目?我意识到GNU Hello可以这样使用,但是我会缺少一些特定于库的实践吗?

我也在搜索关于这个主题的好教程,Program Library HOWTO似乎是最合适的。你还有其他建议吗?

3 个答案:

答案 0 :(得分:3)

Lennart Poettering创建了一个名为libabc: shared library skeleton的项目:

  

为了方便起见,我们整理了一个我们称为libabc的示例骨架库,其README文件包含了我们所有的简洁形式的点。

http://0pointer.de/blog/projects/libabc.html

答案 1 :(得分:1)

以下是我经常提出的一些指导原则。我不完全确定他们会有多大帮助:

http://en.wikipedia.org/wiki/Indent_style

http://www.python.org/dev/peps/pep-0007/

否则,我只是尝试匹配我所看到的。查看上面的样式指南应该可以很好地指示您在代码中寻找和尝试匹配的一致性。

修改

我应该澄清一下,上面的指南并非特定于GNU,但可能会帮助您找到一致性,例如命名方案或制表符/间距指南。

答案 2 :(得分:0)

我阅读了GNU手册并找到了一个简短的例子,我认为这会让你有一个良好的开端:

Straight from the manual:

/* hello.c -- print a greeting message and exit.

    Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    2005, 2006, 2007 Free Software Foundation, Inc.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3, or (at your option)
    any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software Foundation,
    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */

 #include <config.h>
 #include "system.h"

 /* String containing name the program is called with.  */
 const char *program_name;

 static const struct option longopts[] =
 {
   { "greeting", required_argument, NULL, 'g' },
   { "help", no_argument, NULL, 'h' },
   { "next-generation", no_argument, NULL, 'n' },
   { "traditional", no_argument, NULL, 't' },
   { "version", no_argument, NULL, 'v' },
   { NULL, 0, NULL, 0 }
 };

 static void print_help (void);
 static void print_version (void);

 int
 main (int argc, char *argv[])
 {
   int optc;
   int t = 0, n = 0, lose = 0;
   const char *greeting = NULL;

   program_name = argv[0];

   /* Set locale via LC_ALL.  */
   setlocale (LC_ALL, "");

 #if ENABLE_NLS
   /* Set the text message domain.  */
   bindtextdomain (PACKAGE, LOCALEDIR);
   textdomain (PACKAGE);
 #endif

   /* Even exiting has subtleties.  The /dev/full device on GNU/Linux
      can be used for testing whether writes are checked properly.  For
      instance, hello >/dev/full should exit unsuccessfully.  On exit,
      if any writes failed, change the exit status.  This is
      implemented in the Gnulib module "closeout".  */
   atexit (close_stdout);

   while ((optc = getopt_long (argc, argv, "g:hntv", longopts, NULL)) != -1)
     switch (optc)
       {
       /* One goal here is having --help and --version exit immediately,
          per GNU coding standards.  */
       case 'v':
         print_version ();
         exit (EXIT_SUCCESS);
         break;
       case 'g':
         greeting = optarg;
         break;
       case 'h':
         print_help ();
         exit (EXIT_SUCCESS);
         break;
       case 'n':
         n = 1;
         break;
       case 't':
         t = 1;
         break;
       default:
         lose = 1;
         break;
       }

   if (lose || optind < argc)
     {
       /* Print error message and exit.  */
       if (optind < argc)
         fprintf (stderr, _("%s: extra operand: %s\n"),
         program_name, argv[optind]);
       fprintf (stderr, _("Try `%s --help' for more information.\n"),
                program_name);
       exit (EXIT_FAILURE);
     }

   /* Print greeting message and exit. */
   if (t)
     printf (_("hello, world\n"));

   else if (n)
     /* TRANSLATORS: Use box drawing characters or other fancy stuff
        if your encoding (e.g., UTF-8) allows it.  If done so add the
        following note, please:

        [Note: For best viewing results use a UTF-8 locale, please.]
     */
    printf (_("\
 +---------------+\n\
 | Hello, world! |\n\
 +---------------+\n\
 "));

   else
     {
       if (!greeting)
         greeting = _("Hello, world!");
       puts (greeting);
     }

   exit (EXIT_SUCCESS);
 }


 
 /* Print help info.  This long message is split into
    several pieces to help translators be able to align different
    blocks and identify the various pieces.  */

 static void
 print_help (void)
 {
   /* TRANSLATORS: --help output 1 (synopsis)
      no-wrap */
         printf (_("\
 Usage: %s [OPTION]...\n"), program_name);

   /* TRANSLATORS: --help output 2 (brief description)
      no-wrap */
   fputs (_("\
 Print a friendly, customizable greeting.\n"), stdout);

   puts ("");
   /* TRANSLATORS: --help output 3: options 1/2
      no-wrap */
   fputs (_("\
   -h, --help          display this help and exit\n\
   -v, --version       display version information and exit\n"), stdout);

   puts ("");
   /* TRANSLATORS: --help output 4: options 2/2
      no-wrap */
   fputs (_("\
   -t, --traditional       use traditional greeting format\n\
   -n, --next-generation   use next-generation greeting format\n\
   -g, --greeting=TEXT     use TEXT as the greeting message\n"), stdout);

   printf ("\n");
   /* TRANSLATORS: --help output 5 (end)
      TRANSLATORS: the placeholder indicates the bug-reporting address
      for this application.  Please add _another line_ with the
      address for translation bugs.
      no-wrap */
   printf (_("\
 Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
 }


 
 /* Print version and copyright information.  */

 static void
 print_version (void)
 {
   printf ("hello (GNU %s) %s\n", PACKAGE, VERSION);
   /* xgettext: no-wrap */
   puts ("");

   /* It is important to separate the year from the rest of the message,
      as done here, to avoid having to retranslate the message when a new
      year comes around.  */
   printf (_("\
 Copyright (C) %s Free Software Foundation, Inc.\n\
 License GPLv3+: GNU GPL version 3 or later\
 <http://gnu.org/licenses/gpl.html>\n\
 This is free software: you are free to change and redistribute it.\n\
 There is NO WARRANTY, to the extent permitted by law.\n"),
               "2007");
 }