C++ clang坚持编译未调用的函数
从使用英特尔编译器和VC过渡到Apple clang 12.0 在我的代码中,有些函数从未为某个项目调用过(但当包含在其他项目中时需要)。Clang坚持编译未调用的函数并检测错误,而Intel和VC只是跳过了编译 这些错误对于特定的项目来说很难修复 是否有一个叮当当当的标志表示“如果没有调用就不要编译” 编辑:示例:C++ clang坚持编译未调用的函数,c++,compiler-errors,clang++,C++,Compiler Errors,Clang++,从使用英特尔编译器和VC过渡到Apple clang 12.0 在我的代码中,有些函数从未为某个项目调用过(但当包含在其他项目中时需要)。Clang坚持编译未调用的函数并检测错误,而Intel和VC只是跳过了编译 这些错误对于特定的项目来说很难修复 是否有一个叮当当当的标志表示“如果没有调用就不要编译” 编辑:示例: template <class T> class A { public: void foo() { garbage }; // <--- syntax e
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
}
模板类别A
{
公众:
void foo()
长话短说,在clang中有一个选项-fdelayed template parsing
,它接管了模板的错误行为。据我所知,这不是100%匹配,但已经足够了
如果我们将其添加到Artyer的示例中,它将编译代码,请参阅
根据我在MSVC旁边添加clang作为第二个编译器的经验(它仍然在Windows上使用clang cl,我不必处理多个操作系统和/或STL的复杂性),我想建议您将此选项作为一个临时选项来使用。请慢慢删除此选项,因为它将有助于提高代码的可维护性
编辑:如果您想了解更多关于为什么编译错误是正确的操作,您可以查找术语2阶段查找
。您可以在MSVC编译器中找到它的介绍:
从我在网上看到的情况来看,“英特尔编译器”也没有进行两阶段查找,或者至少没有报告错误。您希望clang如何知道您没有在另一个编译单元中调用该函数?能否添加一个示例?(如果要在同一代码上运行多个编译器,请参阅compiler-explorer.com)这真的需要一个。编译器在编译函数的时间上没有区别。我怀疑你对英特尔和微软编译器的说法,但把函数的定义移到你不编译的文件中肯定可以很容易地解决这个问题。我肯定你指的是没有被调用的模板函数。否则,这就是wClang和GCC不像MSVC那样执行模板的静态预编译,并要求它们编译,这也是C++标准的一般要求。注意这似乎只影响模板——不是常规函数。请参阅我的编辑。为什么英特尔接受这个代码有什么解释?“C++书是什么”方法失败还是失败?我稍后再做编辑,C++的方法是在这个代码上失败。我没有英特尔编译器的经验,所以不能给出关于它的信息,但是,我假设它做的和MSVC一样。