为啥mac不需要包含智能指针? [复制]

Posted

技术标签:

【中文标题】为啥mac不需要包含智能指针? [复制]【英文标题】:Why do smart pointers don't need to be included on mac? [duplicate]为什么mac不需要包含智能指针? [复制] 【发布时间】:2019-12-16 09:28:40 【问题描述】:

我在 mac 上偶然发现了一个令人惊讶的行为。当我使用智能指针并使用苹果的 clang 编译时,即使我不包含内存头,它也会编译。 当我从终端编译或使用 IDE 时会发生这种情况。当我使用 clion 时,它不会通知我丢失的标题或任何东西。 当我尝试在 Linux 上构建时,这会导致问题,因为缺少标头。有没有办法可以强制 clion 或编译器对此更加严格?

【问题讨论】:

您可能包含了其他间接包含内存的内容。您无能为力,这是所有标准库的常见问题 但是为什么这在 linux 上不起作用呢? @Picard 包含其他标准库头文件时(大多数情况下)是否包含其他标准库头文件未指定。它们是否在编译器和平台之间有所不同。没有办法确定。每次使用 std:: 中的某些内容时,您都需要查看 C++ 参考,例如 cppreference.com,并查找需要包含的标头,否则可能无法在不同的编译器/平台上运行。 感谢 cmets 和答案。我没想到 iostream 会在 mac 上包含智能指针。 【参考方案1】:

这里的问题是 C++ 标准只要求适当的#include 将您想要的功能引入编译单元。这是设计使然,甚至允许编译器编写者将一些 C++ 标准库功能硬编码到编译器中!

许多 C++ 标准库实现 #include 标头隐式引入了 C++ 标准库功能。在这方面,有些人比其他人更差。

除了严格使用规定的 #includes; 之外,您实际上无能为力。您几乎可以通过反复试验来解决。

【讨论】:

以上是关于为啥mac不需要包含智能指针? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

移动智能指针两次与复制

如何将智能指针传递给函数?

cppyy 继承包含智能指针的类

Part6 数组指针与字符串 6.10 智能指针 6.11 vector对象

当它的目标应该被删除时,为啥这个智能指针会给出正确的结果?

smart_ptr之shared_ptr