使用宏测试 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); \
})
我想要一个宏来做类似的事情:
#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); \
})