Макрос для проверки возвращаемого значения

Хочу написать макрос для семейства функций pthread_*, который бы сравнивал результат функции с нулём, и если значение отлично от нуля вызывал бы мою функцию, передавая в неё это значение Макрос должен быть постфиксным, т. е. должен идти после вызова функции:

pthread_create() MY_MACRO;

где MY_MACRO разворачивается в что-то подобное

my_func(/*результат pthread_create()*/);

Варианты типа

MY_MACRO pthread_create();

и

MY_MACRO(pthread_create());

не рассматриваются по эстетическим причинам


Ответы (3 шт):

Автор решения: Harry

Можно попробовать воспользоваться сокращенными вычислениями логических операторов...

Если pthread_create() возвращает 0, то d

pthread_create() && my_func()

my_func() вычисляться не будет. А если не 0 - будет. Т.е. что-то типа

#define MY_MACRO && my_func()

Вот с передачей значения туго, раз вы такой эстет... разве что повторяйте вызов, раз она с ошибкой - то и второй раз ошибется :) -

#define MY_MACRO && my_func(pthread_create())
→ Ссылка
Автор решения: AlexGlebe

Макросы можно использовать, чтобы сделать свой вариант функции а-ля пространство имён.

# define pthread_create_NameSpace(P,T,F,A,W) { \
    int _e = pthread_create((P),(T),(F),(A)); \
    if ( _e ) { \
      W; } }

Вход в пространство имён :

# define pthread_create pthread_create_NameSpace
pthread_create ( & p , NULL , & func , NULL , printf ("_e=%d\n" , _e ) ; );
# undef pthread_create

и выход.

→ Ссылка
Автор решения: Stuthedian

Если кому-то вдруг понадобится что-то подобное... Можно воспользоваться магией ассемблера: положить в заранее созданную переменную значение регистра, в котором хранится результат функции

#define MY_MACRO ; asm("mov %%eax, %0" : "=r" (result)); result != 0 ? my_func(result) : 0;

Естественно, данное решение имеет спорную переносимость между разными архитектурами процессоров

→ Ссылка