#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++ не было :) средство. "По-моему, так." (с) Пух
Комментариев нет:
Отправить комментарий