如何防止std标头(在Xcode中)内部发生编译错误
How can I prevent compilation errors from occurring inside std header (in Xcode)?
有时,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
运算符,导致编译器错误。
- 致命错误 C1001 :vs2017 15.8.4 的内部错误(编译器文件"msc1.cpp",第
- mingw32_gt_pch_use_address中的内部错误,在config/i386/host-mingw32.c
- 有关使用标志位设置内部错误标志的说明
- 致命错误 C1001:编译器中发生内部错误。'f:\dd\VCtools\Compiler\cxFE\SL\P1\C\P0io.c'
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- ssl3_read_bytes:TLSV1警报内部错误,安全套接字,OpenSSL,C ,获取HTTPS页面
- 构建 C++11 代码时 Coverity 中的内部错误
- 重新打开和 cout 创建内部错误
- 使用variadic概念模板时GCC内部错误
- C1001:编译器中包含 <boost/shared_ptr.hpp 时发生内部错误>
- 错误 C1001:编译器中发生内部错误
- CDT 在以下期间发生内部错误: "Setting up indexer"
- 代码块中存在内部错误
- 致命错误C1001:编译器中发生内部错误
- C++致命错误 C1001:编译器中发生内部错误
- 错误 C1001:调试模式下的编译器中发生内部错误
- 致命错误 C1001:尝试使用模板时出现内部错误
- GDB 在启动时崩溃(内部错误:follow_die_offset)
- C++ CodeDOM 解析器错误:行:75,列:57 ---内部错误
- 嵌套类模板专用化未正确匹配+msvc内部错误