Our website uses cookies to enhance your browsing experience.
Accept
to the top
>
>
Farewell to #define private public

Farewell to #define private public

Apr 24 2012
Author:

The C++ language, compilers and libraries are heading yet farther towards a stricter control over what programmers write. It is good. All of you probably heard jokes about #define true ((rand() % 100) < 95 ? true : false). But joking apart, the possibility to redefine keywords makes a program very difficult to understand or leads to strange errors.

In the new Visual Studio 11 a check is created to detect redefined keywords. The following text in the xkeycheck.h file is responsible for doing this:

#else /* __cplusplus is defined */ 
#if defined(alignas) /* check C++ keywords */ \ 
|| defined(alignof) \ 
|| defined(asm) \ 
|| defined(auto) \ 
|| defined(bool) \ 
|| defined(break) \ 
|| defined(case) \ 
|| defined(catch) \ 
|| defined(char) \ 
|| defined(char16_t) \ 
|| defined(char32_t) \ 
|| defined(class) \ 
|| defined(const) \ 
|| defined(const_cast) \ 
|| defined(constexpr) \ 
|| defined(continue) \ 
|| defined(decltype) \ 
|| defined(default) \ 
|| defined(delete) \ 
|| defined(do) \ 
|| defined(double) \ 
|| defined(dynamic_cast) \ 
|| defined(else) \ 
|| defined(enum) \ 
|| defined(explicit) \ 
|| defined(export) \ 
|| defined(extern) \ 
|| defined(false) \ 
|| defined(float) \ 
|| defined(for) \ 
|| defined(friend) \ 
|| defined(goto) \ 
|| defined(if) \ 
|| defined(inline) \ 
|| defined(int) \ 
|| defined(long) \ 
|| defined(mutable) \ 
|| defined(namespace) \ 
|| defined(new) && defined(_ENFORCE_BAN_OF_MACRO_NEW) \ 
|| defined(noexcept) \ 
|| defined(nullptr) \ 
|| defined(operator) \ 
|| defined(private) \ 
|| defined(protected) \ 
|| defined(public) \ 
|| defined(register) \ 
|| defined(reinterpret_cast) \ 
|| defined(return) \ 
|| defined(short) \ 
|| defined(signed) \ 
|| defined(sizeof) \ 
|| defined(static) \ 
|| defined(static_assert) \ 
|| defined(static_cast) \ 
|| defined(struct) \ 
|| defined(switch) \ 
|| defined(template) \ 
|| defined(this) \ 
|| defined(thread_local) \ 
|| defined(throw) \ 
|| defined(true) \ 
|| defined(try) \ 
|| defined(typedef) \ 
|| defined(typeid) \ 
|| defined(typename) \ 
|| defined(union) \ 
|| defined(unsigned) \ 
|| defined(using) \ 
|| defined(virtual) \ 
|| defined(void) \ 
|| defined(volatile) \ 
|| defined(wchar_t) \ 
|| defined(while) 
#error keyword defined before including C++ standard header 
#endif /* defined... */ 
#endif /* defined(__cplusplus) */ 
#endif /* RC_INVOKED */ 
#endif /* _XKEYCHECK_H */

If you are planning to use Visual C++ 11 soon, you can try to fix the code where you use redefining of keywords beforehand. It is most often used in various tests. For example, to get access to closed class members in tests, the following method is used:

#define private public
#define protected public

Now this code will not be able to compile. For example, we faced this error when trying to build the source codes of the Doom 3 game with Visual C++ 11 (the TypeInfo.cpp file).

We wish you using as few cheating methods as possible. They help you save time in the near-term outlook, but they will sooner or later reveal themselves when changing a platform/compiler, and you will have to rewrite them.

Popular related articles


Comments (0)

Next comments next comments
close comment form
close form

Fill out the form in 2 simple steps below:

Your contact information:

Step 1
Congratulations! This is your promo code!

Desired license type:

Step 2
Team license
Enterprise license
** By clicking this button you agree to our Privacy Policy statement
close form
Request our prices
New License
License Renewal
--Select currency--
USD
EUR
* By clicking this button you agree to our Privacy Policy statement

close form
Free PVS‑Studio license for Microsoft MVP specialists
* By clicking this button you agree to our Privacy Policy statement

close form
To get the licence for your open-source project, please fill out this form
* By clicking this button you agree to our Privacy Policy statement

close form
I am interested to try it on the platforms:
* By clicking this button you agree to our Privacy Policy statement

close form
check circle
Message submitted.

Your message has been sent. We will email you at


If you do not see the email in your inbox, please check if it is filtered to one of the following folders:

  • Promotion
  • Updates
  • Spam