Форум программистов, компьютерный форум CyberForum.ru

Нелепые define-ы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.11.2010, 16:32     Нелепые define-ы #1
Вопрос... Какой смысл в таких define-ах? Чтобы никто ни черта не понял? оО

C++
1
2
3
4
5
6
7
 #define _TRY_BEGIN try {
 #define _CATCH(x)  } catch (x) {
 #define _CATCH_ALL } catch (...) {
 #define _CATCH_END }
 
 #define _RAISE(x)  throw x
 #define _RERAISE   throw
Собственно из файла xstddef MSVS.

Покопавшись чуть глубже нашел такие define-ы.

C++
1
2
#define __DEFINE_CPP_OVERLOAD_STANDARD_FUNC_0_4(_ReturnType, _ReturnPolicy, _DeclSpec, _FuncName, _SalAttributeDst, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2, _TType3, _TArg3, _TType4, _TArg4) \
    __DEFINE_CPP_OVERLOAD_STANDARD_FUNC_0_4_EX(_ReturnType, _ReturnPolicy, _DeclSpec, _FuncName, _FuncName##_s, _SalAttributeDst, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2, _TType3, _TArg3, _TType4, _TArg4)
файл crtdefs.h - разве есть оправдание в применении ТАКИХ макросов?

В файле sal.h вообще define-ы define-ов. типа такого.

C++
1
2
3
4
#define _Pre_z_cap_(size)                _Pre3_impl_(_$notnull,  _$zterm,_$cap(size))       _Deref_pre1_impl_(_$valid)
#define _Pre_opt_z_cap_(size)            _Pre3_impl_(_$maybenull,_$zterm,_$cap(size))       _Deref_pre1_impl_(_$valid)
#define _Pre_z_bytecap_(size)            _Pre3_impl_(_$notnull,  _$zterm,_$bytecap(size))   _Deref_pre1_impl_(_$valid)
#define _Pre_opt_z_bytecap_(size)        _Pre3_impl_(_$maybenull,_$zterm,_$bytecap(size))   _Deref_pre1_impl_(_$valid)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2010, 16:32     Нелепые define-ы
Посмотрите здесь:

C++ define
C++ массивы в define
C++ #define
define не C++
define C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.11.2010, 17:11     Нелепые define-ы #2
C++
1
2
3
4
5
6
7
 #define _TRY_BEGIN     try {
 #define _CATCH(x)      } catch (x) {
 #define _CATCH_ALL     } catch (...) {
 #define _CATCH_END     }
 
 #define _RAISE(x)      throw x
 #define _RERAISE       throw

не хватает:
C++
1
#define Forward_To_cout <<

Не по теме:

Интернет пестирт шутками про индусов, работающих в MS, ну и ни кто невоспринимает это всерьез, все считают, что это шутки. А в действительности индусы в MS сидят и думают: "Как они нас вычислили?"

Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
20.11.2010, 17:27     Нелепые define-ы #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Эти Define'ы нужны для того, чтобы из них "конструировать" код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void func1 (void)
{
  _TRY_BEGIN
  {
    func2 ()
  }
  _CATCH_ALL
  {
    // Обработка
  }
  _CATCH_END
}
 
void func2 (void)
{
  _RAISE (5)
}
По твоим фрагментам сложно сказать, для чего они нужны, но такое "конструирование" обосновано в том случае, если эти макросы можно переопределить как-нибудь по другому. Например:

C
1
2
3
4
#define _TRY_BEGIN if (setjmp(buff) ==0)
#define _CATCH_ALL else
#define _CATCH_END
#define _RAISE(x) longjmp (buff, x)
В итоге если описанный выше пример программы компилять на Си++, то макросы можно определить так, как написано в самом первом посте, а если на Си - то описать так, как я только что расписал через setjmp. Пример несколько высосал из пальца, просто хотел продемонстрировать, для чего такое используют.

Из макросов, например, в Borland C++ конструируется обработчик событий для класса окна. В тело класса пишется что-то типа:

C++
1
2
3
4
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER (WM_USER, TMessage, WM_OnUserMessage)
MESSAGE_HANDLER (WM_WINDOWPOSCHANGING, TMessage, WM_WindowPosChanging)
END_MESSAGE_MAP (TForm)
и после препроцессирования у нас "сконструируется код"

C++
1
2
3
4
5
6
7
8
9
10
11
// Родилось из BEGIN_MESSAGE_MAP
virtual void __fastcall Dispatch(void *Message) { switch (((PMessage)Message)->Msg) {
 
// Родилось из MESSAGE_HANDLER (WM_USER, TMessage, WM_OnUserMessage)
case 0x0400: WM_OnUserMessage(*((TMessage *)Message)); break;
 
// Родилось из MESSAGE_HANDLER (WM_WINDOWPOSCHANGING, TMessage, WM_WindowPosChanging)
case 0x0600: WM_WindowPosChanging(*((TMessage *)Message)); break;
 
// Родилось из END_MESSAGE_MAP (TForm)
default: TForm::Dispatch(Message); break; } }
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.11.2010, 17:29  [ТС]     Нелепые define-ы #4
Evg, Пример использования этого. Из хедера vector

C++
1
2
3
4
5
6
7
            _TRY_BEGIN
            _Ufill(_Mylast, _Count - (_Mylast - _VEC_ITER_BASE(_Where)),
                _Tmp);  // insert new stuff off end
            _CATCH_ALL
            _Destroy(_VEC_ITER_BASE(_Where) + _Count, _Mylast + _Count);
            _RERAISE;
            _CATCH_END
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
20.11.2010, 17:34     Нелепые define-ы #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
По поводу примера из Borland C++. В том числе это делается и для совместимости. К примеру, новая версия Builder'а как-то по другому начинает работать с сообщениями, в этом случае они по другому реализуют макросы BEGIN_MESSAGE_MAP, MESSAGE_HANDLER, END_MESSAGE_MAP. Но пользовательский код менять не придётся. Его нужно будет только перекомпилировать

Про пример использования в vector'е - у меня практически нет опыта работы на Си++, а потому затрудняюсь сказать, зачем делают так. Возможно, что просто для удобства, а возможно, ещё для каких-то умных целей. Препроцессор - очень мощное средство в умелых руках. Если посмотреть на те же самый include'ы от glibc, то "прочитать" их без поллитры крайне затруднительно, но через макросы обеспечивается простота поддержки на разных платформах
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
20.11.2010, 17:37     Нелепые define-ы #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Вопрос... Какой смысл в таких define-ах? Чтобы никто ни черта не понял? оО
Для того, чтобы можно было изменять поведение такого кода. Например, если макрос _HAS_EXCEPTIONS не будет объявлен, то _TRY_BEGIN, _CATCH, _CATCH_ALL и прочие будут вести себя уже по-другому. Такой подход может применяться как для банальной отладки библиотеки так и, например, для того, чтобы библиотечные функции вели себя по-разному, например, в debug и release версиях.

Наглядный пример: в том же xstddef инклудится хедер yvals.h, в котором есть такие строки:
C++
1
2
3
4
5
6
7
#ifndef _CRT_MSVCP_CURRENT
#ifdef _DEBUG
#define _CRT_MSVCP_CURRENT "MSVCP100D.dll"
#else
#define _CRT_MSVCP_CURRENT "MSVCP100.dll"
#endif
#endif
Как не сложно догадаться, тут определятся разный рантайм: одна версия - для отладки, другая - для релиза. Ну и т.д.

Добавлено через 45 секунд
Чёрт, пока писал, уже столько ответов в теме появилось
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2010, 18:28     Нелепые define-ы
Еще ссылки по теме:

C++ #define
C++ c++11 и $define
C++ #define c ::

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3781 / 1765 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
20.11.2010, 18:28     Нелепые define-ы #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
NightmareZ, ForEveR, Kastaneda, уважаемые...
Давайте дружно прекратим подкалывать друг друга и отходить от темы.

Если кто-то забыл где он находится, то я напомню:
КиберФорум - форум начинающих и профессиональных программистов...
Здесь не Олимп, не сборище Богов.
Здесь есть люди, которые много чего умеют и так же есть те, которые желают научиться чему-то.
Данный вопрос явно не относится к "Помогите, в Hello World 3 ошибки и 15 предупреждений".
Автор не просил писать за него программы.
Ему просто интересно было мнение специалистов, которые могут объяснить зачем нужны данные конструкции - и это не повод указывать ему на некомпетентность в данном вопросе. К тому же, человек не способен знать всё. У каждого есть области, в которых он "плавает". Но стремление повысить свои знания никогда не должно быть наказано.
Любой вопрос имеет право на существование (если не нарушает правил форума).

Дальнейшие колкости в сторону собеседников будут пресекаться по всей строгости.
Yandex
Объявления
20.11.2010, 18:28     Нелепые define-ы
Ответ Создать тему
Опции темы

Текущее время: 09:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru