С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
#1

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

20.11.2010, 16:32. Просмотров 2571. Ответов 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-ы (C++):

define не - C++
Здравствуйте. "Дефайню" "%f" для вывода: #define fss "%f"; . И потом делаю вывод вот такой вот: for(i=0;i<n;i++) fscanf(in,fss,&a->di);. И...

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

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

#define c :: - C++
Подскажите как реализовать такую замену: #define sa2::sys::getClientKernel()->getXDBTManager() cls_SimpleXDBTManager::Instance() ...

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

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

6
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,388
Записей в блоге: 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
18383 / 6431 / 441
Регистрация: 30.03.2009
Сообщений: 17,854
Записей в блоге: 28
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
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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
18383 / 6431 / 441
Регистрация: 30.03.2009
Сообщений: 17,854
Записей в блоге: 28
20.11.2010, 17:34 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
По поводу примера из Borland C++. В том числе это делается и для совместимости. К примеру, новая версия Builder'а как-то по другому начинает работать с сообщениями, в этом случае они по другому реализуют макросы BEGIN_MESSAGE_MAP, MESSAGE_HANDLER, END_MESSAGE_MAP. Но пользовательский код менять не придётся. Его нужно будет только перекомпилировать

Про пример использования в vector'е - у меня практически нет опыта работы на Си++, а потому затрудняюсь сказать, зачем делают так. Возможно, что просто для удобства, а возможно, ещё для каких-то умных целей. Препроцессор - очень мощное средство в умелых руках. Если посмотреть на те же самый include'ы от glibc, то "прочитать" их без поллитры крайне затруднительно, но через макросы обеспечивается простота поддержки на разных платформах
3
NightmareZ
1361 / 570 / 37
Регистрация: 31.03.2009
Сообщений: 1,956
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
Эксперт С++
3802 / 1778 / 85
Регистрация: 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
Привет! Вот еще темы с ответами:

#define - C++
#define зачем нужна это заголовочный файл какие у него функции и как им ползоватса?

Директивы define - C++
Рассматривая настоящую объемную программу, наткнулся на огромное количество файлов с длинным списком директив #define. Можете вкратце...

Const #define - C++
{ const int HOLFSDsize= 2;//#define HOLFSDsize 2 // m-угольник void HOLFSD() { int i, n, l; // объявляем...

#define catalog - C++
При разростании проекта возникла проблема. Есть к примеру 10 папок. В каждой есть файл типа *.h с названием обьекта и соответственно...


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

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

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