为什么省略“#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 “有时只会导致编译失败?的主要内容,如果未能解决你的问题,请参考以下文章