Pour obtenir une clé
d'essai remplissez le formulaire ci-dessous
Demandez des tariffs
Nouvelle licence
Renouvellement de licence
--Sélectionnez la devise--
USD
EUR
RUB
* En cliquant sur ce bouton, vous acceptez notre politique de confidentialité

Free PVS-Studio license for Microsoft MVP specialists
To get the licence for your open-source project, please fill out this form
** En cliquant sur ce bouton, vous acceptez notre politique de confidentialité.

I am interested to try it on the platforms:
** En cliquant sur ce bouton, vous acceptez notre politique de confidentialité.

Votre message a été envoyé.

Nous vous répondrons à


Si vous n'avez toujours pas reçu de réponse, vérifiez votre dossier
Spam/Junk et cliquez sur le bouton "Not Spam".
De cette façon, vous ne manquerez la réponse de notre équipe.

>
>
Farewell to #define private public

Farewell to #define private public

24 Avr 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.

Comments (0)

Next comments
Unicorn with delicious cookie
Nous utilisons des cookies pour améliorer votre expérience de navigation. En savoir plus
Accepter