Question:
Recently, in a project where I have to declare many constants, this question came to me. Which is better define's
, enum's
or constant variables?
At first I think that using enum
is the best alternative because it doesn't pollute the code and works better with the IDE's autocompletor, but what would be the pros and cons of each approach?
Example of the options I have:
enum Pin
{
PIN_00 = 0x10,
PIN_01 = 0x11,
PIN_02 = 0x12,
// ... muitos outros
};
Or:
#define PIN_00 0x10
#define PIN_01 0x11
#define PIN_02 0x12
// ... outros defines
Or:
namespace Pin
{
const int PIN_00 = 0x10;
const int PIN_01 = 0x11;
const int PIN_02 = 0x12;
// ... Outros declarações
}
Answer:
If all the constants are related and you want to give them cohesion in the form of a type, enum
is the best choice, as they don't allow you to mistakenly assign them the wrong value.
Pin pin1 = PIN_00; //Ok
Pin pin2 = 0x10; //Não compila
Now if the purpose is just to name a magic number , there is controversy. Personally I prefer const
to #define
, because const
variables are handled by the compiler itself. You have an identifier, with a well-defined type and value. define
is handled by the preprocessor, which can generate unexpected results in some cases. For example:
const int CONST = 2 + 5;
#define DEFINE 2 + 5
int x = 3 * CONST; //Resultado = 3 * (2 + 5)
int y = 3 * DEFINE; //Resultado = 3 * 2 + 5 !!!
Another problem is that the type of define
is only defined by the literal, which can also cause problems:
#define FATOR 1.5
double val = FATOR / 2;
If someone ever changes the value of FATOR
to 1
(instead of 1.0
) that division becomes an integer division, the result of which is 0
, instead of the expected 0.5
. This problem does not happen if FATOR
is const double
.