在学校学习C ++时,我们从未真正谈过如何建立图书馆,对于我的基本理解感到遗憾。
从我在网上看到的,似乎一个库只是已编译的代码集合,然后有一个.h
文件列出了该库中可访问的函数。
例如,当我#include <cmath>
时,我现在可以调用sin(x)
而无需访问cmath代码来编译它。我的问题是,这是否适用于包含数据的类。
我可以创建一个库
//AccumulatorLibrary.h
class Accumulator
{
public:
int num;
int increment() {num++};
void otherFunctions(); //otherFunctions defined in the .lib file
}
然后叫它
//Main
#include "AccumulatorLibrary.h"
#include <stdio>
int main()
{
Accumulator A(0); //initalize num to 0
Accumulator B(7); //initalize num to 7
cout<<A.increment;
cout<<B.increment;
cout<<A.increment;
}
获得1 8 2
的输出?
总之,如果我弄清楚如何将一堆类放入库文件中,我可以访问我想要的任何数据,只要该数据在.h
文件中具有访问功能吗?
或者一个更基本的问题,.h
和.lib
文件的工作方式与常规c ++代码完全相同,只是在使用它时不需要编译,而且你不要是否可以访问.lib
文件中的代码?
答案 0 :(得分:5)
从我在网上看到的,似乎一个库只是已编译的代码集合,然后有一个.h文件列出了该库中可访问的函数。
正确。
我的问题是,这是否适用于包含数据的类。
确实如此。许多C ++库都公开了类,并在库中预编译了代码。
等等,等等。 .h文件仍然包含C ++代码(声明,有时甚至是内联实现)。 .lib文件是动态链接库。它们是C ++源文件的编译(和链接)的结果。或者更基本的问题,.h和.lib文件的工作方式与常规c ++代码完全相同,只是在使用它时不需要编译...
...并且您无权访问.lib文件中的代码?
您可以访问它:使用反汇编程序打开它。它不再是C ++了。
答案 1 :(得分:1)
从我在网上看到的内容来看,它似乎只是一个图书馆 已编译的代码集合
是和否。
对我而言,“库”是一个代码体(一个或多个标题(.h)
文件和零个,一个或多个源(.cpp
)文件),没有{{1函数,可以独立编译和链接(main()
除外)。
可以使用各种机制提供库:
作为来源提供:您必须在此处编译库以及您的应用程序。例如C ++标准模板库,Boost C ++库,您或您的同事编写的库,您从sourceforge下载的库等。(警告:有时基于源的库可以在系统中作为编译优化进行预编译。 )
请注意,作为源提供意味着您可以阅读它,但不一定要修改它。
以二进制形式提供:此处,库已经编译,可能在您的系统中可用。例如C标准库,C ++标准库,C数学库等。从这个问题来看,听起来这就是你所指的那个。
然后有一个.h文件,列出了可以访问的功能 那个图书馆。
是的,就是C库的情况。对于C ++,概念自然扩展为包括类和(公共)成员函数。
总之,如果我弄清楚如何将一堆类放入一个 库文件可以访问我想要的任何数据,只要该数据有 .h文件中的访问功能?
是!
或者更基本的问题,.h和.lib文件的工作方式完全相同 作为常规c ++代码,除了它不必在何时编译 你使用它,并且你无法访问.lib文件中的代码吗?
库遵循相同的C ++规则,如上所述,唯一的区别是它没有main()
函数。
是否需要编译取决于您可以使用的方式(见上文)。
对于许多库,您可以访问源代码(参见上文)。
以下是您示例的完整代码:
main()