有时,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'
答案 0 :(得分:1)
错误在您自己的代码中,而不在标准标题中。
#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
运算符。