Difference between revisions of "C++ style guide"

From Octave
Jump to navigation Jump to search
(Add link to Octave Style Guide)
(fix link to m-file style guide)
Line 4: Line 4:
 
Being part of the GNU project, Octave inherits the [https://www.gnu.org/prep/standards/standards.html#Writing-C GNU coding standards].
 
Being part of the GNU project, Octave inherits the [https://www.gnu.org/prep/standards/standards.html#Writing-C GNU coding standards].
  
See also the GNU Octave [[Octave Style Guide]].
+
See also the GNU Octave [[Octave style guide]] for how to write m-files.
  
 
== Formatting ==
 
== Formatting ==

Revision as of 09:46, 26 March 2016

A lot of GNU Octave is written in C++. This document details the C++ style used by the GNU Octave project.

Being part of the GNU project, Octave inherits the GNU coding standards.

See also the GNU Octave Octave style guide for how to write m-files.

Formatting

Indentation

Use only spaces, and indent 2 spaces at a time.

We use spaces for indentation. Absolutely do not use tabs in your code. You should probably set your editor to emit spaces when you hit the tab key.

Line Length

Keep the length of source lines to 79 characters or less, for maximum readability in the widest range of environments. This is inherited from the GNU Coding Standards.

Header Files

Order of Includes

Use the following order with an empty line between each section:

  1. config.h
  2. The C++ wrappers for C headers (cstdlib, cassert, etc.)
  3. C++ standard library headers (iostream, list, map, etc.)
  4. Other POSIX headers (sys/types.h, unistd.h, etc., no need to use #if defined (HAVE_FOO_H) if existence is guaranteed because of gnulib)
  5. Other library header files (glpk.h, curl.h, etc., should be protected by #if defined (HAVE_FOO_H) since they may be missing on the build system)
  6. Octave's liboctave headers
  7. Octave's libinterp headers

Each grouping of header files should be alphabetized unless there is some specific reason to not do that. The only case where that is true is in oct-parse.in.yy and there is a comment in the file for that one.

Other C++ features

C++11

Do not use C++11 features. Octave is widely used in very old systems and we want them to be able to use up to date versions of Octave. Building a recent compiler in such systems is not a trivial task so the limitation must happen in Octave. See A case for C++11 in the maintainers mailing list.

As of Octave 4.2, Octave's configure will enable C++11 if the compiler supports it. Still, do not use C++11 features.

An exception: code that requires C++11 feature must also implement an alternative code in the absence of said feature. In such case, use a configure check. This increases maintenance a lot, must be used sparsely, and requires approval from other maintainers.

#if HAVE_THIS_C11_FEATURE
  // code that really needs it
#else
  // alternative code in its absence
#endif

This decision may be revisited in the future once cross-compiling becomes more mature.

C++14

Do not use C++14 features. Same reason as why C++11 features are not allowed.