C++ - enum vs. const vs. #define
Solution 1:
Consider this code,
#define WIDTH 300
enum econst
{
eWidth=300
};
const int Width=300;
struct sample{};
int main()
{
sample s;
int x = eWidth * s; //error 1
int y = WIDTH * s; //error 2
int z = Width * s; //error 3
return 0;
}
Obviously each multiplication results in compilation-error, but see how the GCC generates the messages for each multiplication error:
prog.cpp:19: error: no match for ‘operator*’ in ‘eWidth * s’
prog.cpp:20: error: no match for ‘operator*’ in ‘300 * s’
prog.cpp:21: error: no match for ‘operator*’ in ‘Width * s’
In the error message, you don't see the macro WIDTH
which you've #defined
, right? That is because by the time GCC makes any attempt to compile the line corresponds to second error, it doesn't see WIDTH
, all it sees only 300, as before GCC compiles the line, preprocessor has already replaced WIDTH
with 300. On the other hand, there is no any such thing happens with enum eWidth
and const Width
.
See the error yourself here : http://www.ideone.com/naZ3P
Also, read Item 2 : Prefer consts, enums, and inlines to #defines
from Effective C++ by Scott Meyers.
Solution 2:
enum
is compile time constant with debug info with no storage allocation.
const
is allocated with a storage, depending on whether it is optimised away by the compiler with constant propagation.
#define
has no storage allocation.