Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
Прощай #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).

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

Популярные статьи по теме


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

Следующие комментарии next comments
close comment form
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
Ваше сообщение отправлено.

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


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам