Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Зачем в библиотеках используются макросы вместо языковых конструкций?

#cpp #библиотеки #макросы


Объясните, пожалуйста, зачем в стандартной библиотеке, в библиотеках boost и во многих
других библиотеках некоторые ключевые слова, названия пространств имен, функций и т.п.
оформляются в виде макросов? Например, _XSTD, NOEXCEPT, THROW, and и еще многие другие.
При этом имеются ввиду т.н. «рабочие» макросы, т.е. те, которые взаимодействуют с основным
кодом на C++, а не что-то платформенное типа _MSC_VER или __WIN__. Хотелось бы услышать
в ответе некоторые причины/варианты использования в библиотеках макросов.
    


Ответы

Ответ 1



Что касается использования макросов вида THROW, CATCH и т.п., то такие вводятся для возможности отключить механизм исключений при необходимости (пустое определение). Макросы вида NOEXCEPT, DEFAULT и т.п. вводятся с той целью, чтобы бибилотека могла работать с более старыми версиями компиляторов. Например, в boost имеется config-файл, в котором содержатся директивы #define, определяющие или не определяющие, например, BOOST_HAS_CXX_RVALUE_REFERENCES или BOOST_HAS_NOEXCEPT - это зависит от версии компилятора. Далее, #ifndef-ом определяется соответствующий макрос - либо вводя его как альтернативу, например, тому же noexcept, либо делая его «пустышкой».

Ответ 2



Мало ли как придется в новой версии объявлять функции? Вдруг изменится какой-то тип? Или, например, реальная ситуация - изменение спецификации исключений в новом стандарте. Или эти исключения просто нужно будет отключить? Или сейчас компилятор понимает throw(), но пока не понимает noexcept? Словом, максимально обезопасить себя от будущих неприятностей - чтобы при необходимости внесения изменений внести их в минимальном объеме. При этом еще и нужно сделать так, чтобы это работало и в C, и в C++. Да еще и разрабатывалось это все лет 30 назад, а то и раньше. Вот так и стали использоваться именно макросы - как наиболее отвязанное от языка и доступное в те времена, когда еще и C++ не было :) средство. "По-моему, так." (с) Пух

Комментариев нет:

Отправить комментарий