Макрос для проверки возвращаемого значения
Хочу написать макрос для семейства функций pthread_*,
который бы сравнивал результат функции с нулём,
и если значение отлично от нуля вызывал бы мою функцию, передавая в неё это значение
Макрос должен быть постфиксным, т. е. должен идти после вызова функции:
pthread_create() MY_MACRO;
где MY_MACRO разворачивается в что-то подобное
my_func(/*результат pthread_create()*/);
Варианты типа
MY_MACRO pthread_create();
и
MY_MACRO(pthread_create());
не рассматриваются по эстетическим причинам
Ответы (3 шт):
Можно попробовать воспользоваться сокращенными вычислениями логических операторов...
Если pthread_create() возвращает 0, то d
pthread_create() && my_func()
my_func() вычисляться не будет. А если не 0 - будет. Т.е. что-то типа
#define MY_MACRO && my_func()
Вот с передачей значения туго, раз вы такой эстет... разве что повторяйте вызов, раз она с ошибкой - то и второй раз ошибется :) -
#define MY_MACRO && my_func(pthread_create())
Макросы можно использовать, чтобы сделать свой вариант функции а-ля пространство имён.
# 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
и выход.
Если кому-то вдруг понадобится что-то подобное... Можно воспользоваться магией ассемблера: положить в заранее созданную переменную значение регистра, в котором хранится результат функции
#define MY_MACRO ; asm("mov %%eax, %0" : "=r" (result)); result != 0 ? my_func(result) : 0;
Естественно, данное решение имеет спорную переносимость между разными архитектурами процессоров