c++ - 头文件基本上是预先编写的类吗? C++

标签 c++ class directory header-files

正如标题中所述,是您使用#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/

相关文章:

java - ECDSA 使用 BouncyCaSTLe 签名并使用 Crypto++ 验证

c++ - 如何实例化派生类数组

c++ - 如何定义operator<<方法的结束?

c++ - 创建可以包含不同类的变量

javascript - ES6 从子类访问函数

C#:在您拥有 DirectoryInfo 的目录中创建一个新的 FileInfo

c++ - 有人可以解释这个 C 代码如何计算 2^n 吗?

class - 在Scala中,如何获取 `object`(不是类的实例)的名称?

python - 列出当前工作目录中的文件夹

Linux CentOS路径不存在