我正在尝试使用 clang-tidy 来强制执行 C++ 核心指南。虽然它确实有很多有效点,但有一件事我无法真正解决: dlsym 返回一个void*
我需要以某种方式将其转换为正确的函数指针。为此,我使用reinterpret_cast
。由于指南禁止这样做,我对此有警告。
我当然可以放//NOLINT
评论无处不在,但我正在寻找一个不使用的解决方案reinterpret_cast
这样警告就消失了。
有解决此问题的方法吗?
语言中没有其他方法可以将函数指针类型转换为对象指针类型,除了reinterpret_cast
。这样做是实现定义的行为[expr.reinterpret.cast]/8 http://eel.is/c++draft/expr.reinterpret.cast#8:
有条件地支持将函数指针转换为对象指针类型,反之亦然。这种转换的含义是实现定义的,但如果实现支持双向转换,则将一种类型的纯右值转换为另一种类型并返回(可能具有不同的 cv 限定)将产生原始指针值。
这意味着符合标准的 C++ 编译器must如果确实如此,请记录not支持此功能。而且,如果它确实支持它,那么它must记录它的行为到底如何。您可以依赖它在该编译器上以记录的方式工作(或不可用)。
关于核心准则 linting:如果您必须将//NOLINT
“无处不在”,那么这似乎意味着你在称呼裸体dlsym()
在很多地方。例如,考虑将其包裹起来
template <typename T>
inline T* lookupSymbol(void* module, const char* name)
{
auto symbol = reinterpret_cast<T*>(dlsym(module, name)); // NOLINT
if (!symbol)
throw std::runtime_error("failed to find symbol '"s + name + '\'');
return symbol;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)