使用宏测试 C 中函数 return 的值

use macro to test function return value in C

我想要一个宏来做类似的事情:

#define TEST(_ptr) ({ if ((_ptr) == NULL) ERROR; (_ptr); })

检查 _ptr 并调用 ERROR 宏或 return 它的值。

但是,如果我使用类似 var = TEST(fun()) 的东西,这会导致 fun() 被调用两次。

我可以这样做:

#define TEST(_tmp, _ptr) ({ _tmp = _ptr; if ((_tmp) == NULL) ERROR; (_tmp); })

是否有任何干净的方法可以在不通过临时存储的情况下执行此操作,例如使用 typeof 运算符!?

通过比较 (_ptr) == NULL 我假设你的 func() returns 是一个指针。 在这种情况下,您可以将 TEST(_ptr) 宏更改为:

#define TEST(_ptr) ({ void* _rt = _ptr; if ((_rt) == NULL) ERROR; (_rt); })

与其使用宏定义,不如使用常规函数,如:

void *funcCaller (void *f) {
    if (f == NULL) {
        ERROR;    // not sure what the ERROR thing is supposed to do or look like.
    }

    return f;
}

然后调用它:

p = funcCaller (func());

由于 funcCaller() 的参数列表使用 void *,因此 func() 的 return 类型可以是任何指针类型。

你可以这样做:

/* Assuming your ERROR, something like this */
#define ERROR \
({ \
    printf("Error, Null pointer passed\n"); \
    exit(1); \
})

#define TEST1(_ptr) \
({ \
    typeof(_ptr) _tmp = _ptr; \
    if ((_tmp) == NULL) ERROR; \
    (_tmp); \
})