【发布时间】:2016-11-17 21:44:09
【问题描述】:
我正在尝试将在某些情况下返回 int 的 C API 函数和在其他情况下返回的指针包装到宏中,以检查条件并提供诊断并在发生错误时抛出异常。对于返回 int 的函数,这很简单,因为我不需要 int:
#define CALL_INT( name, ... ) do { \
if( !name( __VA_ARGS__ ) ) throw std::runtime_error( #name " failed" );
} while(0)
// using it
CALL_INT( foo, arg );
但是对于返回指针的函数,它并不那么简单,因为我需要对照nullptr 检查该指针,然后将其分配给我的指针。那么是否可以编写类似的宏,所以这个表达式可以工作:
auto ptr = CALL_PTR( foobar, arg1, arg2 );
即它会生成代码,调用foobar( arg1, arg2 ) 对照nullptr 检查结果,如果没有发生错误,则使其可用于赋值。
【问题讨论】:
-
为什么要这样做而不是制作模板包装器?
-
@krzaq 模板包装器无法字符串化函数名
-
仅使用宏将函数名传递给模板化包装器的解决方案会让您满意吗?
-
@krzaq 是的,当然,无论如何你应该提供这个答案,因为它可能对其他人有用
-
为什么不
VERIFY( bob = name( a , b , c ) )?
标签: c++ c++11 c-preprocessor