Зачем заменять существующее ключевое слово в C/C++ макросом?

Я часто сталкиваюсь с ключевыми словами 9X_cpp или однословными идентификаторами, определенными 9X_c другим именем. Например, boost определяет noexcept как 9X_c++ BOOST_NOEXCEPT, некоторые стандартные библиотеки C++ заменяют 9X_lisp-macros [[nodiscard]] на _NODISCARD, Windows API склонен также вводить 9X_macros свои собственные макросы и так далее. Мне 9X_cxx не удалось найти ничего, что могло бы объяснить 9X_scala-macros это.

Это заставляет незнакомого человека 9X_scala-macros искать, что означают такие макросы, что 9X_macros делает код немного сложнее для понимания 9X_scala-macros (по крайней мере, я так это вижу). Почему 9X_custom-macros такая тенденция так распространена? Какова 9X_macros цель замены существующих однословных конструкций 9X_macro макросами?

18
0
2
Общее количество ответов: 2

Ответ #1

Ответ на вопрос: Зачем заменять существующее ключевое слово в C/C++ макросом?

Самый полезный случай — когда вы ориентируетесь 9X_macros как на компиляторы, которые поддерживают 9X_scala-macros новую функцию, так и на те, которые ее не 9X_scala-macros поддерживают.
Например:

#if CompilerSupportsNoexcept
#define NOEXCEPT noexcept
#else
#define NOEXCEPT
#endif

25
0

Ответ #2

Ответ на вопрос: Зачем заменять существующее ключевое слово в C/C++ макросом?

Это может использоваться в различных сценариях 9X_c++ для гибкости и ясности кода. На ум приходят 9X_c следующие случаи:

  • поддержка разных компиляторов, которые по-разному реализуют одну и ту же функцию или не поддерживают вовсе
  • поддержка различных вариантов сборки, т.е. создание статической или динамической библиотеки
  • поддержка разных ОС (функции, экспортируемые динамическими библиотеками, в Windows и Linux будут иметь разные сигнатуры)
  • Сборки отладки и выпуска

10
0