Programming 版 (精华区)

发信人: armstrong (小小), 信区: Programming
标  题: GNU的C++代码书写规范,C语言之父Dennis Ritchie亲自
发信站: 哈工大紫丁香 (2002年02月07日19:24:40 星期四), 站内信件


标题     GNU的C++代码书写规范,C语言之父Dennis Ritchie亲自修订    myan(转贴

关键字     C++ Coding Style
出处     http://www.sunsite.ualberta.ca/Documentation/Gnu/libstdc++-2.90.8/h
tml/17_intro/C++STYLE
C++ Standard Library Style Guidelines  DRAFT 1999-02-26
-------------------------------------
This library is written to appropriate C++ coding standards.  As such,
it is intended to precede the recommendations of the GNU Coding
Standard, which can be referenced here:
http://www.gnu.ai.mit.edu/prep/standards_toc.html
ChangeLog entries for member functions should use the
classname::member function name syntax as follows:
1999-04-15  Dennis Ritchie  <dr@att.com>
* src/basic_file.cc (__basic_file::open): Fix thinko in
_G_HAVE_IO_FILE_OPEN bits.
Notable areas of divergence from what may be previous local practice
(particularly for GNU C) include:
01. Pointers and references
  char* p = "flop";
  char& c = *p;
     -NOT-
  char *p = "flop";  // wrong
  char &c = *p;      // wrong
    Reason: In C++, definitions are mixed with executable code.  Here,
    p          is being initialized, not *p.  This is near-universal
            practice among C++ programmers; it is normal for C hackers
            to switch spontaneously as they gain experience.
02. Operator names and parentheses
  operator==(type)
     -NOT-
  operator == (type)  // wrong
    Reason: The == is part of the function name.  Separating
            it makes the declaration look like an expression.
03. Function names and parentheses
  void mangle()
     -NOT-
  void mangle ()  // wrong
     Reason: no space before parentheses (except after a control-flow
     keyword) is near-universal practice for C++.  It identifies the
     parentheses as the function-call operator or declarator, as
     opposed to an expression or other overloaded use of parentheses.
04. Template function indentation
  template<typename T>
    void
    template_function(args)
    { }
      -NOT-
  template<class T>
  void template_function(args) {};
     Reason: In class definitions, without indentation whitespace is
             needed both above and below the declaration to distinguish
     it visually from other members.  (Also, re: "typename"
     rather than "class".)  T often could be int, which is
     not a class.  ("class", here, is an anachronism.)
05. Template class indentation
  template<typename _CharT, typename _Traits>
    class basic_ios : public ios_base
    {
    public:
      // Types:
    };
  -NOT-
  template<class _CharT, class _Traits>
  class basic_ios : public ios_base
    {
    public:
      // Types:
    };
  -NOT-
  template<class _CharT, class _Traits>
    class basic_ios : public ios_base
  {
    public:
      // Types:
  };
06. Enumerators
  enum
  {
    space = _ISspace,
    print = _ISprint,
    cntrl = _IScntrl,
  };
  -NOT-
  enum { space = _ISspace, print = _ISprint, cntrl = _IScntrl };
07. Member initialization lists
   All one line, separate from class name.
  gribble::gribble()
  : _M_private_data(0), _M_more_stuff(0), _M_helper(0);
  { }
  -NOT-
  gribble::gribble() : _M_private_data(0), _M_more_stuff(0), _M_helper(0);
  { }
08. Try/Catch blocks
  try {
    //
  }
  catch(...) {
    //
  }
  -NOT-
  try { // } catch(...) { // }
09. Member functions declarations and defintions
   Keywords such as extern, static, export, explicit, inline, etc
   go on the line above the function name. Thus
  virtual int
  foo()
  -NOT-
  virtual int foo()
Reason: GNU coding conventions dictate return types for functions
     are on a separate line than the function name and parameter list
     for definitions. For C++, where we have member functions that can
.    be either inline definitions or declarations, keeping to this
     standard allows all member function names for a given class to be
aligned to the same margin, increasing readibility.
10. Invocation of member functions with "this->"
   For non-uglified names, use this->name to call the function.
  this->sync()
  -NOT-
  sync()
The library currently has a mixture of GNU-C and modern C++ coding
styles.  The GNU C usages will be combed out gradually.
Name patterns:
For nonstandard names appearing in Standard headers, we are constrained
to use names that begin with underscores.  This is called "uglification".
The convention is:
  Local and argument names:  __[a-z].*
    Examples:  __count  __ix  __s1
  Type names and template formal-argument names: _[A-Z][^_].*
    Examples:  _Helper  _CharT  _N
  Member data and function names: _M_.*
    Examples:  _M_num_elements  _M_initialize ()
  Static data members, constants, and enumerations: _S_.*
    Examples: _S_max_elements  _S_default_value
Don't use names in the same scope that differ only in the prefix,
e.g. _S_top and _M_top.  See BADNAMES for a list of forbidden names.
(The most tempting of these seem to be and "_T" and "__sz".)
Names must never have "__" internally; it would confuse name
unmanglers on some targets.  Also, never use "__[0-9]", same reason.
--------------------------
[BY EXAMPLE]
#ifndef  _HEADER_
#define  _HEADER_ 1
namespace std
{
  class gribble
  {
  public:
    // ctor, op=, dtor
    gribble() throw();
    gribble(const gribble&);
    explicit
    gribble(int __howmany);
    gribble&
    operator=(const gribble&);
    virtual
    ~gribble() throw ();
    // argument
    inline void
    public_member(const char* __arg) const;
    // in-class function definitions should be restricted to one-liners.
    int
    one_line() { return 0 }
    int
    two_lines(const char* arg)
      { return strchr(arg, 'a'); }
    inline int
    three_lines();  // inline, but defined below.
    // note indentation
    template<typename _Formal_argument>
      void
      public_template() const throw();
    template<typename _Iterator>
      void
      other_template();
  private:
    class _Helper;
    int _M_private_data;
    int _M_more_stuff;
    _Helper* _M_helper;
    int _M_private_function();
    enum _Enum
      {
_S_one,
_S_two
      };
    static void
    _S_initialize_library();
  };
// More-or-less-standard language features described by lack, not presence:
# ifndef _G_NO_LONGLONG
  extern long long _G_global_with_a_good_long_name;  // avoid globals!
# endif
  // avoid in-class inline definitions, define separately;
  //   likewise for member class definitions:
  inline int
  gribble::public_member() const
  { int __local = 0; return __local; }
  class gribble::_Helper
  {
    int _M_stuff;
    friend class gribble;
  };
}
// Names beginning with "__": only for arguments and
//   local variables; never use "__" in a type name, or
//   within any name; never use "__[0-9]".
#endif /* _HEADER_ */
namespace std {
  template<typename T>  // notice: "typename", not "class", no space
    long_return_value_type<with_many, args>
    function_name(char* pointer,               // "char *pointer" is wrong.
  char* argument,
  const Reference& ref)
    {
      // int a_local;  /* wrong; see below. */
      if (test)
      {
  nested code
      }
      int a_local = 0;  // declare variable at first use.
      //  char a, b, *p;   /* wrong */
      char a = 'a';
      char b = a + 1;
      char* c = "abc";  // each variable goes on its own line, always.
      // except maybe here...
      for (unsigned i = 0, mask = 1; mask; ++i, mask <<= 1) {
  // ...
      }
    }
  gribble::gribble()
  : _M_private_data(0), _M_more_stuff(0), _M_helper(0);
  { }
  inline int
  gribble::three_lines()
  {
    // doesn't fit in one line.
  }
}

对该文的评论
      zcd_jimy (2002-2-7 17:03:55)
完了,和《高质量C++编程指南》所说的有很多冲突,如:char *p = "flop",这里说不
好, 而《高》又说这样好。信谁的?
      walkerliu (2002-2-7 14:02:30)
和cpp_stroller有同感,而且不止这一处,myan有没有好的理由。
      walkerliu (2002-2-7 13:57:56)
和cpp_stroller有同感,而且不止这一处,myan有没有好的理由。
      cpp_stroller (2002-2-5 16:46:47)
关于01好像与常识有点不一样: 1: c++ primer中推荐为char *p; 2: 两者在VC编译
器下的disassemble code没有区别大师的解释我又有点搞不明白所以: myan兄是否可以
帮忙解释一下
      b9r1p6 (2002-2-2 20:27:30)
就是!
      wenzic (2002-2-2 14:41:51)
good
      wgku (2002-2-2 11:08:40)
同上,不错,收藏先
      Toulouse (2002-2-1 17:56:14)
不错,收藏先

--
Everybody believes that children are true,
women are beautiful and
men are strong.

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.236.209]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:214.538毫秒