We have moved to https://dokuwiki.librecad.org/

Lots of content was already moved to the new wiki, but there is still work to do. If you want to contribute, please register a new account at https://dokuwiki.librecad.org/

This wiki will be kept for a while to keep search engine results valid. Moved sites may be deleted here in future.

LibreCAD 3 - LibreCAD 3 - code style

From LibreCAD wiki
Revision as of 15:22, 15 April 2018 by Feragon (Talk | contribs)

Jump to: navigation, search

Code style guide

Line length
Maximum line length is 120 columns


  • Between if, for, while and (
  • Between comparison operators
  • After ,


  • Namespace blocs
  • public and private +1 and methods +2


  • use #pragma once instead of #ifndef
  • Include what you use
  • Do not use virtual and override in the same declaration

Accessor naming


instead of


All immutables must be created 'valid', throw an exception on an attempt to create an invalid immutable:

Circle::Circle(Coordinate const& center, double radius) : _center(center), _radius(radius) {
    if (_radius < 0.0) {
        throw "Invalid radius";

All variables in an immutable class must be declared as const.


Only throw where code is effectively unreasonable:

document->entityByID(...); // return null if an entry does not exists

Variable naming

Use typedefs to shorten otherwise difficult to read names:


    // OR

    typedef std::shared_ptr<Circle> Circle_SPtr;
    typedef std::shared_ptr<const Circle> Circle_CSPtr;

This can also make further variable-use more legible:

  std::list<std::shared_ptr<const Circle>> myListVeryLong; // very long
  std::list<Circle_CSPtr> myList; // better readable

Shared pointers

Shared pointers should be passed by const reference, they can be passed as value if they are going to be stored in the target (with std::move)

Namespace std

Don't bring in the 'std' namespace into global; always use std::vector, std::map, std::string etc...

Variable declarations

Declare variables on separate lines to make them easier to read and to annotate.


const Coordinate _extensionPoint1; // check dependencies...
const Coordinate _tangentPoint2;


const Coordinate _extension_point1, _tangentPoint2; // which one did I want?

Const variables

You must add const modifiers after the variable type.


Line::Line(geo::Coordinate const& start, geo::Coordinate  const  & end, Layer_SPtr const layer) : CADEntity(layer), Vector(start, end) {..}


Line::Line(geo::Coordinate const & start, const geo::Coordinate& end, Layer_SPtr const layer) : CADEntity(layer), Vector(start, end) {..}

Camel case

Use it as much as possible, though some exceptions are allowed:

  • Variable names in a class may start with a underscore;
  • An '_' (underscore) may be added if the variable name gets unreadable, e.g. in 'Dimension_CSptr';
  • Underscores can help make function names autological, e.g. on_dimRadial_changed:


  const String _textValue;
  void on_dimRadial_change() {...};


  const String _text_value;
  void on_dim_radial_change() {...};

Class names always start with an Upper-case letter.

Variable names always start with a lower-case letter.