正如标题中所述,是您使用#include 的头文件,基本上是预先编写/预先编码的类,其中包含方法和变量,一旦将其包含到脚本中就可以使用。另外,如何才能做到可以简单地使用为自己的利益创建的头文件呢?一个简单的解释就可以了。
最佳答案
是与否……这取决于很多因素。
include 指令 - 对于标准 C++ 来说 - 可以是两件事:
#inlclude "filename"
和
#include <header>
第一个的字面意思是“保留“文件名”中包含的文本并将其粘贴到此处。 所以是的,文件可以包含预先编写的类(但不是必须的)
第二个意思是“让这个源使用标准在其 <header>
部分中定义的设施。按照标准定义,这不一定是一个文件,尽管我今天的所有实现事实上知道:header 是一个文件名,<>
和 ""
只是更改编译器搜索顺序。
此时,您可以将“非常长的 Cpp 源代码”切割成更小的自包含 block ,并得到一个 cpp 文件,该文件不过是一系列 #include
。和一个 main()
.
但这还不是全部。
C++ 程序不一定由单个 cpp 文件(一个 cpp 文件加上它直接或间接包含的所有内容称为“翻译单元”)。
实际上编译产生的不是程序,而是一个“链接器”拼凑出来的“目标文件”(这个词是“古代操作系统术语”,与面向对象编程无关)。
因为调用另一个函数的 C++ 函数不需要-被翻译-知道另一个函数是如何翻译的,而只需要知道它的参数和返回值是如何传递和获取的,这使您能够编写另一个函数body 在另一个独立编译的源代码中,让 header 只包含它的声明(而不是定义)。
例如你可以有
// fooclass.h
#ifndef FOOCLASS_H
#define FOOCLASS_H
class foo
{
public:
void hello();
void bye();
};
#endif // FOOCLASS_H
,
// out.h
#ifndef OUT_H
#define OUT_H
#include <string>
void printout(const std::string& s);
#endif // OUT_H
,
//main.cpp
#include "fooclass.h"
int main()
{
foo afoo;
afoo.hello();
afoo.bye();
}
,
// fooclass.cpp
#include "fooclass.h"
#include "out.h"
void foo::hello()
{ printout("hello"); }
void foo::bye()
{ printout("bye"); }
,
// out.cpp
#include "out.h"
#include <iostream>
void printout(const std::string& s)
{ std::cout << "- " << s << " -" << std::endl; }
整个程序可以编译(例如用 GCC)为
g++ main.cpp fooclass.cpp out.cpp
或在单独的步骤中
g++ -c main.cpp
g++ -c fooclass.cpp
g++ -c out.cpp
g++ main.o fooclass.o out.o
(如果您使用 MS 编译器,您很可能会这样做
cl /c main.cpp
cl /c fooclass.cpp
cl /c out.cpp
link main.obj fooclass.obj out.obj
)
只有最后一步构成了程序(注意 main.cpp 永远不会知道 printout
函数!)。前三项仅对已更改的文件才需要,因此在大型项目上可以加快编译速度并将任务分配给不同的团队。 (有像 make
这样的实用程序,可以使这件事自动化。
现在有一个异常(exception),它变得越来越重要:模板。 由于它们不是作为“待翻译的代码”而是作为“待扩展的代码”实现的,因此只有当它们需要扩展的内容已知时,它们才能被翻译。
template<class T>
T max(const T& a, const T& b)
{ return (a<b)? b: a; }
(a<b)
的含义取决于自己的类型T
实际上是。因为只有在 max
时才知道被调用,max可以展开为max<int>
或 max<double>
或 max<string>
仅在使用时。
因此,模板通常不会在独立的翻译单元中处理,而提供模板类或函数的库仅通过提供包含所有代码的 header 集合来做到这一点,无需单独编译源代码。
关于c++ - 头文件基本上是预先编写的类吗? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22928783/