6

我正在尝试使用 clang-tidy 来执行 C++ 核心指南。虽然它确实有很多有效点,但有一件事我无法真正解决:dlsym 返回一个void*我需要以某种方式将其变成正确的函数指针。为此,我使用reinterpret_cast. 由于指南禁止这样做,我对此有警告。当然,我可以在//NOLINT任何地方发表评论,但我正在寻找一种不使用的解决方案,reinterpret_cast这样警告就会消失。

有没有解决这个问题的方法?

4

1 回答 1

7

语言中没有其他方法可以将函数指针类型转换为对象指针类型,除了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;
}
于 2019-03-26T17:30:30.363 回答