gpt4 book ai didi

c++ - 将返回指针的 C API 函数包装到宏调用中

转载 作者:行者123 更新时间:2023-11-27 22:48:24 24 4
gpt4 key购买 nike

我试图将在某些情况下返回 int 的 C API 函数和在其他情况下返回指针的 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 检查结果,如果没有发生错误,则使其可用于分配。

最佳答案

真正的解决办法是:不要使用宏。只需写下你想做的内联。您和其他所有人稍后都会感谢您自己。


字面上的解决方案是立即调用 lambda:

#define MAYBE_THROW(f, ...)                                   \
[&]{ \
auto _result = f(__VA_ARGS__); \
if (!_result) throw std::runtime_error(#f " failed"); \
return _result; \
}()

MAYBE_THROW(foo, arg);
auto ptr = MAYBE_THROW(foobar, arg1, arg2);

关于c++ - 将返回指针的 C API 函数包装到宏调用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40665590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com