to the top
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
Прощай #define private public

Прощай #define private public

24 Апр 2012

Язык C++, компиляторы и библиотеки движутся всё больше в сторону ужесточения контроля того, что пишет программист. Это хорошо. Все наверное слышали шутки вот на эту тему: #define true ((rand() % 100) < 95 ? true : false). Шутки, шутками, но возможность переопределить ключевые слова иногда приводит к значительному затруднению понимания программы или непонятным ошибкам.

В новой Visual Studio 11 сделана проверка для выявления переопределения ключевых слов. Для этого в файле xkeycheck.h имеется следующий текст:

#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 */

Если вы планируете в скором будущем использовать Visual C++ 11, то можно заранее постараться исправить код, где используется переопределение ключевых слов. Чаще всего это применяется в различных тестах. Например, чтобы в тестах получить доступ к закрытым членам классов, используются следующий приём:

#define private public
#define protected public

Теперь этот код скомпилирован не будет. Мы, например, встретили такую ошибку, при попытке собрать с помощью Visual C++ 11 исходные коды игры Doom 3 (файл TypeInfo.cpp).

Желаем вам поменьше использовать различных обманных приёмов. Они экономят время в краткосрочной перспективе, но рано или поздно всплывают при смене платформы/компилятора и их приходится переписывать.

Популярные статьи по теме
Хорошо ли ChatGPT ищет ошибки в коде?

Дата: 02 Мар 2023

Автор: Артём Ровенский

Нейросети всё больше вливаются в привычный мир, пытаясь упростить нам жизнь. Тот же ChatGPT вызвал бурю обсуждений в интернете. Чат бот способен писать тексты, код, рефераты и песни. Он даже умеет ис…
Обзор плагина PVS-Studio для Visual Studio Code

Дата: 02 Фев 2023

Автор: Андрей Москалёв

Благодаря новому плагину PVS-Studio преимущества статического анализа теперь доступны и при работе с редактором Visual Studio Code. В этой статье мы разберём использование плагина от этапа установки …
Изменения в PVS-Studio, о которых полезно знать

Дата: 31 Янв 2023

Автор: Сергей Васильев

В этой статье расскажу о том, что появилось в PVS-Studio за последние три года, и чем это полезно пользователям анализатора. Статья модульная: можно не читать от начала до конца, а посмотреть только …
C++ — язык 2022 года. Почему так, и что с другими языками?

Дата: 20 Янв 2023

Автор: Сергей Васильев

C++ становится языком 2022 года по версии TIOBE, обгоняя Python. Rust, C#, Go и прочие — далеко позади. Странно? Сейчас разберёмся.
PVS-Studio в 2022 году

Дата: 19 Янв 2023

Автор: Полина Алексеева

На дворе январь 2023, а значит, самое время подвести итоги уже прошлого 2022 года. Мы расскажем, чем занимались, и покажем, что нового появилось в анализаторе за это время. Давайте вместе взглянем на…

Комментарии (0)

Следующие комментарии next comments
close comment form
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо