информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяSpanning Tree Protocol: недокументированное применениеАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Шестой Perl превратится в Raku,... 
 Kik закрывается, все ушли на криптофронт 
 Sophos открывает Sandboxie 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] А возможно ли написать такой макрос: 03.09.02 21:23  Число просмотров: 774
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
Vo blia vse nado razzhevat`.
bot primer:
#define test( a ) a?GetLastError():55

void main()
{
	int i;
	i = test(1);
	i = test(0);
}

---
<programming>
[C++] А возможно ли написать такой макрос: 01.09.02 04:12  
Автор: Бяша <Biasha> Статус: Member
Отредактировано 01.09.02 09:23  Количество правок: 1
<"чистая" ссылка>
Я макросы писать не умею, так как начал учить С, когда С уже не было, а был С++, а в нём не принято их писать :)
Но очевидно средствами с++ то, что я хочу, не сделать:

Хочется ускорить проверку возвращаемого функциями значения, что бы не писать каждый раз:

HANDLE heap = GetProcessHeap();
if (heap == NULL)
{
	DWORD e = GetLastError();
	char *str = new char[256];
	strintf(str, "%s:%d\nGetProcessHeap:%d",_FILE__LINE_ e);
	throw str;
}

Запихнув код в класс довёл до:

HANDLE heap = GetProcessHeap();
if (heap == NULL)
	throw CError("GetProcessHeap", GetLastError(),_FILE__LINE_;

Если ещё и макрос написать, можно добиться:

HANDLE heap = GetProcessHeap();
if (heap == NULL)
	throwe("GetProcessHeap");

На этом мои идеи исчерпались. А хочется так:

HANDLE heap = chf(NULL, GetProcessHeap());

---
То есть нужно чтобы макрос, проверил возвращаемое функцией значение.
Если оно равно указанному первым параметром значению - вызвал throw, передав класс, содержащий всю информацию об ошибке в catch.
А если не равно - вернул это значение.

Причём просто проверку возвращаемого значения я сделать могу:
#define chf(fail, func) if ((func) == (fail)) throw CError(#func, GetLastError(),_FILE__LINE_; else;
Но иногда мне нужно возвращаемое функцией значение.
Ну и какие проблеммы ? 01.09.02 22:41  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
> Причём просто проверку возвращаемого значения я сделать
> могу:
> #define chf(fail, func) if ((func) == (fail)) throw
> CError(#func, GetLastError(),_FILE__LINE_; else;
> Но иногда мне нужно возвращаемое функцией значение.

#define chf( f, n, r ) \
{ \
int a = n; \
if( a == f ) throw; \
else r = a; \
}

Если же ты хочешь, что бы макрос работал как ф-ия и ты бы писал r = chf();
то обломись.
[C++] А возможно ли написать такой макрос: 01.09.02 06:56  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
operator ?:
> Я макросы писать не умею, так как начал учить С, когда С
> уже не было, а был С++, а в нём не принято их писать :)
> Но очевидно средствами с++ то, что я хочу, не сделать:
>
> Хочется ускорить проверку возвращаемого функциями значения,
> что бы не писать каждый раз:
>
>
> HANDLE heap = GetProcessHeap();
> if (heap == NULL)
> {
> 	DWORD e = GetLastError();
> 	char *str = new char[256];
> 	strintf(str, "%s:%d\nGetProcessHeap:%d",_FILE_
>_LINE_ e);
> 	throw str;
> }
> 
> Запихнув код в класс довёл до:
> 
> HANDLE heap = GetProcessHeap();
> if (heap == NULL)
> 	throw CError("GetProcessHeap", GetLastError(),
>_FILE__LINE_;
> 
> Если ещё и макрос написать, можно добиться:
> 
> HANDLE heap = GetProcessHeap();
> if (heap == NULL)
> 	throwe("GetProcessHeap");
> 
> На этом мои идеи исчерпались. А хочется так:
> 
> HANDLE heap = chf(NULL, GetProcessHeap());
> 

---
> То есть нужно чтобы макрос, проверил возвращаемое функцией
> значение.
> Если оно равно указанному первым параметром значению -
> вызвал throw, передав класс, содержащий всю информацию об
> ошибке в catch.
> А если не равно - вернул это значение.
>
> Причём просто проверку возвращаемого значения я сделать
> могу:
> #define chf(fail, func) if ((func) == fail) throw
> CError(#func, GetLastError(),_FILE__LINE_ else;
> Но иногда мне нужно возвращаемое функцией значение.
[C++] А возможно ли написать такой макрос: 01.09.02 09:19  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> operator ?:

Ну и?
А чем, он, собственно, лучше if else?
Навсякий случай явно обращу внимание на то, что хочется ещё и имя (либо имя и параметры) функции, вернувшей ошибку, получить. Вот как я написал в самом конце корневого сообщения. Но там значение функции не нужно.
[C++] А возможно ли написать такой макрос: 03.09.02 21:23  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
Vo blia vse nado razzhevat`.
bot primer:
#define test( a ) a?GetLastError():55

void main()
{
	int i;
	i = test(1);
	i = test(0);
}

---
Хехе 03.09.02 21:37  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
А теперь напиши свой макрос так, что бы возвращать не 55, а то что вернула ф-ия, в макросе объявленная как "a". Причем второй раз её вызывать НЕЛЬЗЯ :)

То что человек пытается спросить - это анрил. Для таких целей есть ф-ии, и инлайн ф-ии.

> Vo blia vse nado razzhevat`.
> bot primer:
>
> #define test( a ) a?GetLastError():55
> 
> void main()
> {
> 	int i;
> 	i = test(1);
> 	i = test(0);
> }
> 

---
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2019 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach