Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
1

Нелепые define-ы

20.11.2010, 16:32. Просмотров 2689. Ответов 6
Метки нет (Все метки)

Вопрос... Какой смысл в таких 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)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2010, 16:32
Ответы с готовыми решениями:

#define
Здравствуйте, дорогие программисты! сразу хочу сказать, что в С++ я совсем...

#define
#define зачем нужна это заголовочный файл какие у него функции и как им...

define
Всем здрасьте , что означает эта строчка? #define MAX(a,b) a>b? a:b

#define c ::
Подскажите как реализовать такую замену: #define ...

define не
Здравствуйте. "Дефайню" "%f" для вывода: #define fss "%f"; . И потом делаю...

6
Kastaneda
Jesus loves me
Эксперт С++
4949 / 3026 / 346
Регистрация: 12.12.2009
Сообщений: 7,627
Записей в блоге: 2
Завершенные тесты: 1
20.11.2010, 17:11 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 сидят и думают: "Как они нас вычислили?"

2
Evg
Эксперт CАвтор FAQ
19359 / 7208 / 538
Регистрация: 30.03.2009
Сообщений: 20,155
Записей в блоге: 30
20.11.2010, 17:27 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; } }
6
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
20.11.2010, 17:29  [ТС] 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
0
Evg
Эксперт CАвтор FAQ
19359 / 7208 / 538
Регистрация: 30.03.2009
Сообщений: 20,155
Записей в блоге: 30
20.11.2010, 17:34 5
Лучший ответ Сообщение было отмечено как решение

Решение

По поводу примера из Borland C++. В том числе это делается и для совместимости. К примеру, новая версия Builder'а как-то по другому начинает работать с сообщениями, в этом случае они по другому реализуют макросы BEGIN_MESSAGE_MAP, MESSAGE_HANDLER, END_MESSAGE_MAP. Но пользовательский код менять не придётся. Его нужно будет только перекомпилировать

Про пример использования в vector'е - у меня практически нет опыта работы на Си++, а потому затрудняюсь сказать, зачем делают так. Возможно, что просто для удобства, а возможно, ещё для каких-то умных целей. Препроцессор - очень мощное средство в умелых руках. Если посмотреть на те же самый include'ы от glibc, то "прочитать" их без поллитры крайне затруднительно, но через макросы обеспечивается простота поддержки на разных платформах
3
NightmareZ
1424 / 613 / 59
Регистрация: 31.03.2009
Сообщений: 1,991
20.11.2010, 17:37 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 секунд
Чёрт, пока писал, уже столько ответов в теме появилось
2
MikeSoft
Эксперт С++
3920 / 1785 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
20.11.2010, 18:28 7
Лучший ответ Сообщение было отмечено как решение

Решение

NightmareZ, ForEveR, Kastaneda, уважаемые...
Давайте дружно прекратим подкалывать друг друга и отходить от темы.

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

Дальнейшие колкости в сторону собеседников будут пресекаться по всей строгости.
6
20.11.2010, 18:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2010, 18:28

C++define
Люди добрые , помогите советом ! Фрагмент с кодом самого метода : ...

c++11 и $define
Есть код который прекрасно компилируется без -std=c++11, но как только я...

define
И еще такой вопрос для чего служит #define ??


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru