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

How can I prevent compilation errors from occurring inside std header (in Xcode)?

本文关键字:内部 错误 编译 Xcode std 何防止 标头      更新时间:2023-10-16

有时,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'

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

以下内容可与GCC、Clang和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-3259-1w2uld/example.cpp:3:

在包含的文件中//usr/lib/gcc/x86_64-linux-gnu/4.8/../../../include/c++/4.8/memory:81:

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

static_assert(sizeof(_Tp(>0,

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