> Причём просто проверку возвращаемого значения я сделать > могу: > #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();
то обломись.
Я макросы писать не умею, так как начал учить С, когда С уже не было, а был С++, а в нём не принято их писать :)
Но очевидно средствами с++ то, что я хочу, не сделать:
Хочется ускорить проверку возвращаемого функциями значения, что бы не писать каждый раз:
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;
Но иногда мне нужно возвращаемое функцией значение.
> Причём просто проверку возвращаемого значения я сделать > могу: > #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
Ну и?
А чем, он, собственно, лучше if else?
Навсякий случай явно обращу внимание на то, что хочется ещё и имя (либо имя и параметры) функции, вернувшей ошибку, получить. Вот как я написал в самом конце корневого сообщения. Но там значение функции не нужно.
[C++] А возможно ли написать такой макрос:03.09.02 21:23 Автор: + <Mikhail> Статус: 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);
> }
>