关于CPP文件和标题

时间:2016-03-23 18:25:52

标签: c++ header

我现在正在学习C ++。这是我的问题: 其他人可以使用我们已定义的任何类成员函数,即使他们没有我们的cpp文件吗?详细的答案会更好。感谢。

5 个答案:

答案 0 :(得分:1)

如果代码 存储在文件中,那么C ++语言标准就没有说明代码是如何或应该在文件中进行物理分发的。

特别是标准库头文件不一定是物理文件,即使大多数实现都将这些头文件作为文件提供。

实现文件和头文件是一种约定,但仅限于代码的物理打包,包含通过预处理器#include指令包含的头文件,以及为单独编译而设计的实现文件。通常,实现文件(如.cpp文件)对应于标准中的转换单元。但在某些情况下,使用其他物理源代码包装思想,例如,设计用于包含在其他实现文件中的实现文件。

函数的实现可以放在实现文件或头文件中,或者例如在数据库中,标准并不在意。但是,由于打算使用源代码文件的方式,如果实现放在头文件中,而不是模板,那么它应该是inline,以便它可以在两个或多个翻译中出现包含该标题的单位。如果header-in-a-header直接在类定义中,那么它将自动inline,否则需要显式声明inline

现在,如果用户拥有实现源代码,那么可以使用该函数。

同样,如果用户有一个函数声明加上一个合适的编译版本,那么同样可以使用它。

如果用户没有实现的源代码或编译版本,则无法使用它。

所以,这与文件没什么关系。但是,您是否可以在没有实现文件的情况下分发代码。如上所述,是的,您可以,而且通常称为仅标题模块

主要是,只有标题模块可以执行普通单独编译代码可以执行的所有操作,但有一个例外:它们不能提供“编译器防火墙”来包含标头提供的符号。

这导致两个主要问题:(1)名称空间的污染,以及(2)无法提供(没有重写和尴尬的解决方案)两个模块,其实现依赖于彼此的声明。

但是,许多代码仅作为标题模块分发。特别是Boost库的大部分是仅标题模块。主要的优点是,对于这些部件的使用,没有构建库或使用不同选项等构建单独编译代码的复杂性。

答案 1 :(得分:0)

如果这些功能的实施在CPP文件内,他们就不能这样做。 如果头文件.h或.hpp包含定义和实现,则可以。

答案 2 :(得分:0)

  

其他人可以使用我们定义的任何类成员函数,即使他们没有我们的cpp文件吗?

是的,只要您提供包含已编译的.cpp文件的库,并且它适合其编译器ABI,他们就能够使用您的代码,而无需自己编译.cpp文件

答案 3 :(得分:0)

要使用函数,应该声明函数,并且应该(当然)在某处实现,并且对于使用类成员函数,函数应该是public而不是private。

现在其他人(和你)如果他们没有在某处实现你就不能使用你的函数,而在你的情况下,如果他们没有包含实现的.cpp文件,那么真正的问题不在于.cpp文件但是你已经实现了你的功能。

真的如果你想与某个人分享你的功能,你应该把它们作为一个包含实际实现的库和一个为这个库提供接口的头文件共享它们,这样用户将无法访问你的函数的源代码。

答案 4 :(得分:0)

是的,如果你建立一个库,他们可以用你的标题分发它。然后,人们可以链接到您的库,以使用头文件中声明的函数和类。该库将包含二进制文件中cpp文件的代码,标题将指导用户编译器如何调用库中的代码。

以下是Windows的文档和Linux教程:
https://msdn.microsoft.com/en-us/library/ms235636.aspx
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html