🎉 Celebrating 25 Years of GameDev.net! 🎉

Not many can claim 25 years on the Internet! Join us in celebrating this milestone. Learn more about our history, and thank you for being a part of our community!

Elements of Programming Style -- The C++ Style Guide

Published September 13, 1999 by Neill Kipp, posted by Myopic Rhino
Do you see issues with this article? Let us know.
Advertisement
[size="5"]Files

Header files have a ".h" suffix. Header file contains class, struct, and union declarations, enum declarations, #defines, typedefs.

Implementation files have a ".cc" (UNIX) or ".cpp" (Windows, DOS) suffix. Implementation files contain function and method implementations.

Make a header block in header files and source code files. The header should contain title, author, date, and project information as well as a simple description of how the file fits into the project.

[size="5"] Names of Things

Names of Common C++ Characters

{open brace, open curly}close brace, close curly(open parenthesis, open paren)close parenthesis, close paren[open bracket]close bracket.period, dot!exclamation point, bang, not|bar, vertical-bar, or, or-bar (actually a "vertical virgule")&ampersand, and, reference, ref*asterisk, multiply, star, pointer/slash, divide//slash-slash, comment#pound\backslash, (sometimes "escape")~tilde

[size="5"] Names and Indentation

[size="3"] Names of Naming Conventions
  • interspersed_underscores
  • lowercaseMixedCapital
  • CapitalMixedCapital
  • ALL_UPPERCASE[size="3"]Applications of Naming Conventions
    • enumeration_item_name
    • variableName
    • TypeName, ClassName, MethodName()
    • UnixFileName.cc
    • dosfn.cpp
    • POUND_DEFINES[size="3"] Self-documenting Code
      • Use long names for every name in your program.[size="3"] No Magic Numbers
        • Numeric constants besides 0 (and sometimes 1) are not allowed. Use constants or #defines.[size="3"] Whitespace
          • Space (what you get when you press spacebar)
          • Newline (what you get when you press enter)
          • Tab (substitutes for 8 spaces)[size="3"] Space and Indentation
            • After an open brace, indent every subsequent line four spaces until the matching close brace.
            • If an if, while, or for has no brace following, indent the next line two spaces.
            • Indent lines which end in a colon backward two spaces (public, case).
            • A space precedes and follows reserved words (if, else, class, struct) unless preceded or followed by indentation or newlines or special punctuation.
            • A space precedes and follows operators and comparators (except unary operator bang is not followed by a space).
            • Pointer variants (ampersand, star) are preceded and followed by space in declarations.
            • Pointer variants (ampersand, star) are preceded (but not followed) by a space in expressions.
            • A space follows an open parenthesis.[size="3"] Newline
              • Newline precedes an open brace in the following: class, struct, union, enum, method, function (but not: if, else, do, for, while, switch --- these braces are preceded by a single space.)
              • Newline follows a close brace for method, function, if, else, do, for, while, switch.
              • Semi-colon, then newline, then blank line after close brace for class, struct, union.
              • Newline follows an open brace.[size="3"] Comments
                • Comments always begin at current indentation level with "//" and a space.
                • No other construct may appear on the same line as a comment.
                • Comments always preceed the construct they address.
                • Use complete sentences in a comment.
                • When describing a statement, comments may be in the imperative. Above all, be guided by what pleases the eye. Be guided by what makes your code MORE READABLE.

                  [size="5"] Header File Example

                  // MODULE NAME: ClassName.h
                  // PROJECT: CS1344-1,2 Course Notes
                  // AUTHOR: Neill Kipp
                  // DATE: January 1, 1996
                  // DESCRIPTION: This file presents examples of naming and
                  // indentation style in a C++ class declaration. This title
                  // information is minimal.

                  // The following prevents files from being included
                  // twice. It is a naming exception designed to emulate a file name
                  // (period is not a name character; underscore is).
                  #ifndef ClassName_h
                  #define ClassName_h

                  // This directive includes the superclass declaration.
                  #include "super.h"

                  // This directive includes another class declaration.
                  #include "other.h"

                  // The comment for an enumeration declaration precedes the declaration.
                  enum OverflowState
                  {
                  // Each item's comment precedes it at the same indentation as the item.
                  no_overflow,

                  // Follow the last item with a comma;
                  // it helps avoid syntax errors when adding or rearranging items.
                  overflow_occurred,
                  };

                  // This class shows how naming conventions and comments are used in a
                  // simple class declaration. Whitespace precedes and follows reserved
                  // words (like "public").

                  class ClassName
                  {
                  // After a brace, indent four spaces.
                  // The description of the variable "memberData" goes here.
                  int memberData;

                  // If a line ends in single colon, reverse-indent two spaces.
                  public:

                  // The constructor gives initial values to member data.
                  ClassName();

                  // The destructor guarantees clean deallocation.
                  // The tilde (~) is part of the method name. It is not an operator.
                  ~ClassName();

                  // This method increments the member variable by the value in "howMuch"
                  // and returns TRUE if overflow is detected (FALSE otherwise). Method
                  // comments tell what the method does, what the arguments are,
                  // and what the method returns.
                  OverflowState IncrementMemberVariable( int howMuch);

                  // Prints message about overflow.
                  void ShowOverflow( OverflowState overflow);
                  };


                  #endif
                  [size="5"] Source code file example

                  // MODULE NAME: ClassName.cc
                  // PROJECT: CS1344-1,2 Course Notes
                  // AUTHOR: Neill Kipp
                  // DATE: January 1, 1996
                  // DESCRIPTION: This file presents examples of naming and
                  // indentation style in a C++ class implementation. This title
                  // information is minimal.

                  // This directive includes header information for the "ClassName" class.
                  #include "ClassName.h"

                  ClassName::
                  ClassName()
                  {
                  // Initialize member data (statement comments are in the imperative,
                  // and preceed the statement). Suggestion: write the comments first, then
                  // write the code.
                  memberData = 0;
                  }

                  // The return type appears on the first line,
                  // followed by the class name colon-colon on the second,
                  // and finally the method name on the last. Then a newline, an open brace
                  // and then indent. Notice the space after the open parenthesis. It helps
                  // the eye catch the type name.
                  OverflowState
                  ClassName::
                  IncrementMemberVariable( int howMuch)
                  {
                  // Check the overflow condition.
                  if ( TOO_BIG - memberVariable > howMuch) {
                  // If overflow, return that overflow occurred.
                  return overflow_occurred;
                  } else {
                  // Otherwise, return overflow is ok.
                  return overflow_none;
                  }
                  }

                  // This code implements the ShowOverflow method.
                  void
                  ClassName::
                  ShowOverflow( OverflowState overflow)
                  {
                  // Switch is a reserved word. It is followed by a space.
                  switch ( overflow) {

                  // Lines ending in a colon reverse indent two spaces.
                  case no_overflow:
                  // Display message about no overflow.
                  cout << "No overflow occurred.\n";
                  break;

                  case overflow_occurred:
                  // Display message that overflow occurred.
                  cout << "Warning: overflow occurred.\n";
                  break;
                  }
                  }

                  [size="5"] Other examples

                  // Note the spacing and indentation in the for statement.
                  for ( whichItem = 0; whichItem < BIG_NUMBER; whichItem++) {
                  DoSomething( whichItem);
                  }

                  // Bang is not followed by a space.
                  while ( !SemaphoreOK()) {
                  DoWaitForSemaphore( LONG_TIME);
                  }
Cancel Save
0 Likes 1 Comments

Comments

Dario Oliveri

regarding lowercaseMixedCapital and CapitalMixedCapital, there's already a name for them:

mixedCapital

CamelCase (I guess because of the O'Camel language)

Regarding self documenting code, there are only 2 rules

- write code that is easy to understand what it do

- comment only when needed

I'll avoid to "use long names". first of all "USE RIGHT NAMES": some names will be long, some others will be short. If possible never use defines (neither for constants!, maybe a static member variable is better scoped ?). Defines should do only pre-compiler magic. (import export macro, header guards.. if you start using defines for different stuff consider some alternative way to solve your problem.. if possible).

Also I tend to move all "copyright/author" stuff at the end of files. When I want to program I usually want to see immediatly the class, not who did it. If later the class have some trouble then I'll look who did it.

August 07, 2013 03:05 PM
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!
Advertisement