Я хочу иметь макрос, который выполняет что-то вроде:
#define TEST(_ptr) ({ if ((_ptr) == NULL) ERROR; (_ptr); })
, который проверяет _ptr
и вызывает ERROR
макрос или возвращает его значение.
Однако, если я использую что-то вроде var = TEST(fun())
, это приводит к тому, что fun()
вызывается два раза.
Я могу сделать что-то вроде:
#define TEST(_tmp, _ptr) ({ _tmp = _ptr; if ((_tmp) == NULL) ERROR; (_tmp); })
is Есть ли чистый способ сделать это без передачи временного хранилища, например, используя оператор typeof
!?