【发布时间】:2019-08-17 04:14:24
【问题描述】:
我正在尝试使用 clang-tidy 来执行 C++ 核心指南。虽然它确实有很多有效点,但有一件事我无法真正解决:dlsym 返回一个void*,我需要以某种方式将其转换为正确的函数指针。为此,我使用reinterpret_cast。由于指南禁止这样做,我对此有警告。
当然,我可以将//NOLINT cmets 放在任何地方,但我正在寻找不使用reinterpret_cast 的解决方案,因此警告消失了。
这个问题有解决办法吗?
【问题讨论】:
-
没办法。这是一个众所周知的问题。
-
从语言的角度来看,仅仅从
void*转换为函数指针类型是粗略的。对象指针和函数指针不是兼容的类型,甚至不能保证具有相同的大小。尽管任何提供dlsym的平台编译器都必须以某种方式与之抗衡。事实上,通过void*返回函数指针的函数确实存在问题。 -
@FrançoisAndrieux 从对象指针转换为函数指针,反之亦然,有条件地支持。如果一个平台提供
dlopen,它可能支持这样的转换。 -
为
dlsym创建一个包装器,因此您只需在包装器中使用一次//NOLINT。 -
@FrançoisAndrieux 该标准要求如果一个实现支持有条件支持的功能那么它必须遵守某些规则。是的“应该产生原始指针值”就是这样的规则。
标签: c++ clang-tidy