gpt4 book ai didi

c++ - 如何防止在 std header (在 Xcode 中)内发生编译错误?

转载 作者:行者123 更新时间:2023-11-28 06:51:34 32 4
gpt4 key购买 nike

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

最佳答案

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

以下编译正常with 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
}

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

In file included from /tmp/gcc-explorer-compiler114426-23259-1w2uld/example.cpp:3:

In file included from /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: error: invalid application of 'sizeof' to an incomplete type 'B'

static_assert(sizeof(_Tp)>0,

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

关于c++ - 如何防止在 std header (在 Xcode 中)内发生编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23860990/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com