Earlier quoted context omitted.
Shadowing keywords is perfectly valid, although I believe you can't shadow keywords in standard headers so that compiler writers don't need to worry about it. It gives rise to some "useful" C/C++ features that should never be used, like if you want to access private members in foo.cpp, do #define private public #include "foo.cpp" #undef private
I can imagine some insidious menace adding this to the top of a file: #define public protected
#define else
#define struct union
Evil!