clang 坚持编译未调用的函数

clang insists on compiling uncalled functions

从使用 Intel 编译器和 VC 转向 Apple clang 12.0。

在我的代码中,有些函数从不为某个项目调用(但在包含在其他项目中时需要)。 Clang 坚持编译未调用的函数并检测错误,Intel 和 VC 只是跳过了编译。

对于某个项目,这些错误很难修复。

是否有 Clang 标志表示“如果未调用则不编译”?

编辑:示例:

template <class T> class A
{
public:
    void foo() { garbage }; // <--- syntax error
};

int main() {
    A<int> my_obj;
    //my_obj.foo(); // <--- when unremarked, will fail all compilers
}

Compiler Explorer demo: Intel vs. Clang

Intel 和 VC 编译器在调用 foo() 进入场景之前放松。

Clang 有一种模式,在这种模式下,它会尝试表现得好像它是 MSVC。这是作为 clang-cl 的一部分引入的,clang 的驱动程序接受许多与 MSVC 相同的参数。您可以在 user manual and the MSVC compatibility 页面上找到有关它的一些信息。

长话短说,clang 中有一个选项 -fdelayed-template-parsing 可以接管模板的错误行为。据我所知,这不是 100% 匹配,但是已经足够了。

如果我们将此添加到 Artyer 的示例中,它会编译代码,请参阅 compiler-explorer

根据我在 MSVC 旁边添加 clang 作为第二个编译器的经验(它仍然在 Windows 上使用 clang-cl,我不必处理多个 OS 的复杂性and/or STL),我想向您推荐将此选项作为让事情正常运行的临时措施。花点时间删除它,因为它将有助于使您的代码更易于维护。

编辑: 如果您想了解更多关于为什么编译错误是正确的做法,您可以查找术语 2 phase lookup。您可以在此处的 MSVC 编译器中找到它的介绍公告:https://devblogs.microsoft.com/cppblog/two-phase-name-lookup-support-comes-to-msvc/

据我在网上看到的,英特尔编译器也没有进行 2 阶段查找,或者至少没有报告错误。