c++ - 铛坚持编译未调用的函数

标签 c++ compiler-errors clang++

从使用英特尔编译器和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-cl的驱动程序接受许多与MSVC相同的参数。您可以在user manualMSVC compatibility页面上找到有关它的一些信息。
长话短说,在clang中有一个-fdelayed-template-parsing选项可以接管模板的错误行为。据我所知,这并不是100%的匹配,但这已经足够了。
如果将其添加到Artyer的示例中,它将编译代码,请参见compiler-explorer
根据我在MSVC旁边添加clang作为第二个编译器的经验(我仍然在Windows上使用clang-cl,我不必处理多个OS和/或STL的复杂性),我想向您推荐将此选项作为临时工作来使工作正常进行。花点时间删除它,因为这将有助于使代码更易于维护。
编辑:如果您想更多地了解为什么编译错误是正确的选择,则可以查找2 phase lookup一词。您可以在以下MSVC编译器中找到其介绍的公告:https://devblogs.microsoft.com/cppblog/two-phase-name-lookup-support-comes-to-msvc/
从网上可以看到,intel编译器没有进行两阶段查找,或者至少没有报告错误。

关于c++ - 铛坚持编译未调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65510205/

相关文章:

c++ - 通过分发目标文件加速编译

c++ - 静态指针初始化复位 'after' 初始化

compiler-errors - 文件写入记事本时出错,它一直提示

c++ - clang 6 不支持 unordered_map::merge?

用于旧 gcc 的 C++ 模板在 clang++ 中导致 'shadows template parameter' 错误

c++ - 为何模板参数不参与类的定义/重新定义

符合 C++ STL 的分配器

ios - 文件丢失错误 iOS Xcode

java - 不完整的类型 :<anonymous ActionListener>cannot be converted to component

c++ - ld : symbols not found for architecture x86_64, clang: 链接器命令失败