Typically, the way I’d define a true global constant (lets say, pi) would be to place an extern const in a header file, and define the constant in a .cpp file:
constants.h:
extern const pi;
constants.cpp:
#include "constants.h"
#include <cmath>
const pi=std::acos(-1.0);
This works great for true constants such as pi. However, I am looking for a best practice when it comes to defining a “constant” in that it will remain constant from program run to program run, but may change, depending on an input file. An example of this would be the gravitational constant, which is dependent on the units used. g is defined in the input file, and I would like it to be a global value that any object can use. I’ve always heard it is bad practice to have non-constant globals, so currently I have g stored in a system object, which is then passed on to all of the objects it generates. However this seems a bit clunky and hard to maintain as the number of objects grow.
Thoughts?
It all depends on your application size. If you are truly absolutely sure that a particular constant will have a single value shared by all threads and branches in your code for a single run, and that is unlikely to change in the future, then a global variable matches the intended semantics most closely, so it’s best to just use that. It’s also something that’s trivial to refactor later on if needed, especially if you use distinctive prefixes for globals (such as
g_) so that they never clash with locals – which is a good idea in general.In general, I prefer to stick to YAGNI, and don’t try to blindly placate various coding style guides. Instead, I first look if their rationale applies to a particular case (if a coding style guide doesn’t have a rationale, it is a bad one), and if it clearly doesn’t, then there is no reason to apply that guide to that case.