C++ 结构原型在单独的头文件中

Posted

技术标签:

【中文标题】C++ 结构原型在单独的头文件中【英文标题】:C++ Struct prototyping in separate header file 【发布时间】:2015-06-08 15:36:40 【问题描述】:

我无法理解an answer I saw in another post。它说在一个单独的 .h 文件中定义一个结构体是一种很好的做法,这样它就可以在其他文件中使用。我认为这很好,它解决了我目前的困境,但是我有一个关于编译和 makefile 的问题。我目前只熟悉与 .cpp 文件关联的头文件。

有人可以解释当我有 .h 而没有 .cpp 时该实现的外观吗?我还需要一个实现文件吗?另外,如何链接生成文件中的标题?目前我只知道如何将 .cpp & header 编译成 .o 文件并链接它们。

谢谢,也很抱歉带我们回到 C++ 幼儿园。这是一个新的启示,似乎是一个很好的启示。

【问题讨论】:

【参考方案1】:

您不需要为每个头 .h 文件匹配一个源文件(.c 或 .cpp)。

头文件没有对应的源文件就好了。

当你#include一些头文件的时候,你可以把它看成是一种“复制粘贴”操作:预处理器复制头文件的内容,并粘贴到点的包容性。 (嗯,这里有一些细节需要考虑,例如 #pragma once 指令或一些 #ifdef 包含保护可以防止给定项目中同一头文件的多次包含。)

C 和 C++ 编译器随后将处理整个“编译单元”,即包含所有头文件的当前源文件。

【讨论】:

头文件和编译单元之间的区别从另一个角度来看也很重要:编译单元(.cpp + .h)被编译为正在交付的机器代码,即程序或库.为了使用库的 API,您需要(明文)头文件,当然还需要库本身。但是,.cpp 文件中包含的源代码不需要提供。【参考方案2】:

关键概念是您在.h 标头中定义结构/类,以便您可以在多个.cpp 文件中使用它。每当您需要在foo.h 中定义的struct foo 时,您就需要#include "foo.h"。你不需要直接编译头文件,它会被任何使用它的源文件拉进来。因此,在正常情况下,您不需要 .h 的 make 目标。

如果标题中的定义从未使用过,则不会被拉入,仅此而已。

【讨论】:

感谢您的快速反馈,我每天都从你们那里学到新东西!

以上是关于C++ 结构原型在单独的头文件中的主要内容,如果未能解决你的问题,请参考以下文章

C++中CTime的头文件

VS c++2005中头文件有的为啥必须加.h比如malloc

C++中头文件<ctime>包含哪些函数

C++中头文件(.h)和源文件(.cpp)都应该写些什么

C++中的cmath头文件

在VC中头文件的问题