文件依赖树和代码重用
文件依赖树
根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义:
变量的声明有两种情况:
1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
2、另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。
(1)声明必须使用extern关键字;
(2)不能给变量赋初值;
所以,下面的是声明:
extern int a;
下面的是定义
int a; int a = 0; extern int a =0;
h文件和cpp文件都素文件,当成一般文件,都可以写声名和实体,若要被根级h头文件和cpp文件访问必须使用include进来,继承必须包含头文件
全局变量方案:
方案一、h和cp文件都包含进入引用它的h中,双列树,实现映射所有全局变量到达根部,从树叶尖向下流
方案二、全放在h文件中,形成h头单列h树实现映射所有全局变量到达根部,从树叶尖向下流
方案三、全局变量只有根结中定义 或不用全局变量或把全局变量放到应用层而不是在库类层级
全局变量各个都素局部全局变量,只有通过include进某入文件后,在该文件中可方问被include的文件局部全局变量,可以单身包含成链表或树多向包含成 网。
最后都是根元去调用并执行。
继承h树方案
方案一、h头包含继承头h和使用头h cpp中无
方案二、继承头h放h中h中用的用大类型声名, cpp头中加入使用头
代码重用
一般建议单向包含构建一个树型,java c#也是 basic也是
树型叠层最终运行于根节点处。
函数复有:同文件中调用 不同文件中include进来调用 直要include就可以使用 可有函数 、局部全局变量、类;
相应的树类型 :文件树如include一样,在一个工程内,与根级在同一工程同一树中;
lib复用:是类或函数字节文件已编译好的 配合头文件使用 C# 和vb一样的 pb一样 库只有dll 没有lib C/C++ 有lib 有dll 可有局部全局变量、函数、类 但要在namespace下声名;
相应树类型:lib工程内局部树,命名空间中声名导出接口,命名空间在局部树根级中声名;
注:可以传递
dll 可以有局部全局变量、 类 、函数 要声名为 接口或导出模块def中声名,才可导出。
相应树类型: dll工程内局部树,声名导出接口/def中声名,declspec 在哪声名都可 def声名也可;
dll特别所在:声名导出只是接口在lib中 程序函数指针,dll有自己的空问,调用它的线程loadlibrary会复制接口全局变量或常量到自己的空间内dll自己在调用它的进程空间中再生成自己使用的一份。
loadlibrary在进程空间中生成两份数据,因些dll中的全局变量在调用它的线程中初始化后,dll中仅保存地址于自己使用的第二份数据空间。
注:dll单向引用,dll传出的只能是自己的定义或实例化的东西。在线程中。
Win32 程序调用 DLL 的机制
Win32 EXE 在调用一个外部 DLL 中的函数时,首先要调用 LoadLibary 函数来载入此 DLL 到程序的进程地址空间。 如果 LoadLibary 载入此 DLL 成功,将返回一个该 DLL 的句柄。 这个句柄实际上就是该 DLL 在内存中的起始地址。 在载入 DLL 成功后,还必须调用 GetProcAddress 函数来获取要调用的函数的地址。然后再根据该地址来调用这个函数。
根据上述原理,我们可以把一个 DLL 作为资源文件放到 EXE 文件中,在程序运行时,分配一块内存,然后将此资源复制到该分配的内存中,并根据该内存地址计算得到相关的导出函数地址,然后,当我们需要调用某一函数时,可以用该函数在内存中的地址来调用它。
程序实现。静态变量会初始化像一变exe的一样在调用它的线程中, 调用dll的函数时使用的是dll自己在调用它的进程中生成的数据空间的变量,拷贝到exe空机的并不改变,
dll作为一个库模块,全局变理和静态变量有自己的空间,动行时dll在自己的空间(也在调用它的进程空间内)运行,若在导出的变量,调用它的线程会拷贝一份,
dll作为一个服务存在于系统中,调用由另一进程管理,使用的堆的栈 常量全局都是调用它的exe线程的堆和栈、全局空间,但跳到访dll运行时,cpu的堆栈不变,使用的空间为线程空间,全局变量和静态变量用的都素dll自己的它空间内。
Dll基本原则:
lul开发层次的分类: 1、类库层的开发 (类 函数或几个类) 最深达到线程类 2、模块层的开发 (实现特定模块功能的框架) 3、库用软件层开发( 不共享的软件独用的开发好便是 一个完整的软件应用) 最大型的是操作系统