C++ - enum vs. const vs. #define

c++, constants, enumeration, macros

Solution

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.

Problem

At the end of the article here: http://www.learncpp.com/cpp-tutorial/45-enumerated-types/, it mentions the following: Finally, as with constant variables, enumerated types show up in the debugger, making them more useful than #defined values in this regard. How is the bold sentence above achieved? Thanks.

Original source

Related problems