为什么省略“#include “有时只会导致编译失败?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么省略“#include “有时只会导致编译失败?相关的知识,希望对你有一定的参考价值。

我是C ++的初学者。当我编写代码有时我写#include <string>和代码工作,其他时候我不写#include <string>和代码不起作用。但有时它没有#include <string>

所以我必须编写#include <string>以便代码有效吗?

答案

如果您使用在标准头string中声明的成员然后是,则必须直接或间接地(通过其他头)包含该头。

某些平台上的某些编译器可能在本月的某个时间编译,即使您未能包含标头。这种行为是不幸的,不可靠,并不意味着你不应该包括标题。

原因很简单,你已经包含了其他标准的标题,这些标题也恰好包括string。但正如我所说,这通常不能依赖它,它也可能会突然改变(例如,当安装新版本的编译器时)。

始终包含所有必需的标题。遗憾的是,似乎没有关于需要包含哪些标头的可靠在线文档。查阅书籍或官方C ++标准。

例如,以下代码使用我的编译器编译(gcc 4.6):

#include <iostream>

int main() {
    std::string str;
}

但是,如果我删除第一行,即使iostream标题实际上不相关,它也不再编译。

另一答案

您执行的其他标头可能包含#include <string>

尽管如此,如果这些“其他”标题发生变化(例如,由于编译器/标准库实现的不同(或不同版本)),即使对于成功构建而言并非严格必要,通常也可以直接在代码中使用#include <string>。 ,平台甚至只是一个构建配置。

(当然,这个讨论适用于任何标题,而不仅仅是<string>。)

另一答案

虽然,在特定的源文件中没有直接出现#include <string>,但这并不意味着它没有包含在另一个头文件中。考虑一下:

文件:header.h

#if !defined(__HEADER_H__)
#define __HEADER_H__

// more here
#include <string>
// ...and here

#endif

文件:source1.cc

#include <string>

void foo()
{
    // No error here.
    string s = "Foo";
}

文件:source2.cc

#include <header.h>

void bar()
{
    // Still no error, since there's a #include <string> in header.h
    string s = "Bar";
}

文件:source3.cc

void zoid()
{
    // Here's the error; no such thing as "string", since non of the
    // previous headers had been included.
    string s = "Zoid";
}
另一答案

如果您只是使用指向用户定义类型的指针/引用,则只需要声明类型:

class my_class;
void foo(const my_class& c);

但是当您使用该值时,编译器需要知道大小以及类型的定义。

请记住,标准标题可能包含其他标题,这并不意味着所有实现都会这样做,因此您不能依赖它。

另一答案

标题字符串不是由其他标题包含的。标题字符串本身只包含。没有定义。因此,使用字符串所需的所有必要定义都在标题字符串包含的标题中。这些标头可能已包含在其他标头中。一切正常。标题ios例如包括stringbuf,其中包括...

另一答案

即使您没有明确包含字符串,它也包括在内,因为您包含了另一个标准标题。例如,矢量可能包含字符串。当你包含vector时,vector中的所有东西都会包含在你的文件中。

我认为Cpp的未来版本应该有一个include_module或module关键字;其中只包含文件中的特定模块。因此,如果一个文件有3个类,我们只包含我们需要的类。

例如 -I“../mingw/lib/include”

 module <string>

在目录中搜索定义字符串类的文件。编译速度会慢得多。

以上是关于为什么省略“#include “有时只会导致编译失败?的主要内容,如果未能解决你的问题,请参考以下文章

C语言函数声明什么时候可以省略,什么时候不能省?

C ++中易失性数据成员的地址

OpenGL 纹理导致 ImGUI 窗口永久失焦

在 Maven 依赖项中显示省略的版本:树?

在 Oracle 11g2 XE 中编译 PL/SQL 函数有时会导致 ORA-00600:内部错误

document.activeElement 过滤选择文件弹窗导致的页面失焦