如何防止std头(在Xcode中)内发生编译错误?

时间:2014-05-25 23:44:15

标签: c++ xcode compiler-errors clang

有时,Xcode会在std文件中显示编译错误。 我怎么能设置它以便它直接在我的源文件中显示错误?

[编辑:请参阅JBentley的答案,以便更好地了解我正在寻找的内容]

这是一个例子:我知道这段代码不会编译。我想要的是Xcode在这里指出错误,而不是在memory文件中(请参阅下面的错误):

#include <vector>
#include <memory> //

class B;

class A{
   std::unique_ptr<B> ptr;
};

int main(){ //(added after JBentley's answer)
   A a;
   return 0;
}

错误消息:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr
/lib/c++/v1/memory:2424:27: Invalid application of 'sizeof' to an incomplete type 'B'

1 个答案:

答案 0 :(得分:1)

错误在您自己的代码中,而不在标准标题中。

以下编译好with GCCClang和MSVC:

#include <vector>
#include <memory>
class B;

class A{
   std::unique_ptr<B> ptr;
};

但是,如果您尝试实例化类型为A的对象,那么您将收到您发布的错误消息(这导致我怀疑您没有发布完整示例,你正在尝试):

#include <vector>
#include <memory>
class B;

class A{
   std::unique_ptr<B> ptr;
};

int main(){
   A a; // Error - B has not been defined
}

这是因为您提供了B的前向声明,但没有定义。编译器需要查看B的定义,因为您使用的是智能指针,它执行内存管理。要修复错误,请确保在实例化之前编译器已知该定义。

或者,如果使用原始指针,则编译器不需要查看定义:

#include <vector>
#include <memory>
class B;

class A{
   B* ptr;
};

int main()
{
   A a; // No error
}

至于让编译器在源文件而不是标准头中显示错误,它确实以环形方式执行此操作。您发布的错误消息不是完整消息。以下是我在Clang中收到的完整错误消息:

  

包含来自的文件   /tmp/gcc-explorer-compiler114426-23259-1w2uld/example.cpp:3:

     

包含来自的文件   /usr/lib/gcc/x86_64-linux-gnu/4.8 /../../../../包括/ C ++ / 4.8 /存储器:81:

     

/usr/lib/gcc/x86_64-linux-gnu/4.8 /../../../../ include / c ++ / 4.8 / bits / unique_ptr.h:65:16:错误:应用程序无效'sizeof'到不完整类型'B'

     

static_assert(的sizeof(_TP)大于0,

正如您所看到的,这显示了导致错误的文件层次结构 - 我的源文件example.cpp包括memory,其中包含unique_ptr.h,导致编译器错误到期试图在我的源文件中声明的不完整类型sizeof上调用B运算符。