我正在尝试使用 clang-tidy 来执行 C++ 核心指南。虽然它确实有很多有效点,但有一件事我无法真正解决:dlsym 返回一个void*
我需要以某种方式将其变成正确的函数指针。为此,我使用reinterpret_cast
. 由于指南禁止这样做,我对此有警告。当然,我可以在//NOLINT
任何地方发表评论,但我正在寻找一种不使用的解决方案,reinterpret_cast
这样警告就会消失。
有没有解决这个问题的方法?
我正在尝试使用 clang-tidy 来执行 C++ 核心指南。虽然它确实有很多有效点,但有一件事我无法真正解决:dlsym 返回一个void*
我需要以某种方式将其变成正确的函数指针。为此,我使用reinterpret_cast
. 由于指南禁止这样做,我对此有警告。当然,我可以在//NOLINT
任何地方发表评论,但我正在寻找一种不使用的解决方案,reinterpret_cast
这样警告就会消失。
有没有解决这个问题的方法?
语言中没有其他方法可以将函数指针类型转换为对象指针类型,除了reinterpret_cast
. 这样做是实现定义的行为[expr.reinterpret.cast]/8:
有条件地支持将函数指针转换为对象指针类型或反之亦然。这种转换的含义是实现定义的,除非实现支持双向转换,将一种类型的纯右值转换为另一种类型并返回,可能具有不同的 cv 限定,应产生原始指针值。
这意味着如果一个符合标准的 C++ 编译器不支持此功能,则必须记录它。而且,如果它确实支持它,它必须记录它的行为方式。您可以依靠它在该编译器上以记录的方式工作(或不可用)。
关于核心指南 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;
}