`
fixopen
  • 浏览: 83931 次
文章分类
社区版块
存档分类
最新评论

C/C++的缺陷之模块和实体引用,兼论C++的namespace

阅读更多
先从基础概念说起。

模块就是一组相关的实体的集合。该定义如此的简练以至于含糊不清,不过该概念非常强大,整个软件开发行业都是因为引入了该概念而充分发育起来的。比如我们常说的模块化什么的。

进一步的说,模块一般从概念上区分为接口和实现两个部分。主意,我说的是概念上。这就会导致我们可以相对抽象的看问题,可以解决比较复杂的大问题。

更进一步,模块对于不同的客户(显然也是别的模块),可以呈现出不同的接口。模块的客户显然不应该关注模块的实现。模块这个概念的引入就是为了这个目的,如果模块的用户需要知道模块的实现,那么,引入模块的好处就丧失殆尽,只有坏处了。

按照上面罗嗦的一大通,我们看看C/C++中的模块什么?套用概念,我们似乎发现:函数、类、名字空间等都可以是模块,但是不是。C/C++直接提供支持的模块单元是源文件。C/C++把源文件区分为两种,一种叫做头文件,提供模块的接口,一种叫做源文件,提供模块的实现。看起来非常优雅,不是么?

其实C、C++的模块机制非常粗鲁,非常差劲。

我逐一描述它们的缺陷。

一、接口和实现的物理分离。
这是一个非常差劲的选择,可是这个因为C/C++中的模块引用机制的问题不得不如此。不记得有多少次了,我没有能够保证接口和实现的同步导致各种极端难堪的问题出现。相信你一定经历过这种不同步的困扰。逻辑上的分离不需要物理上也分离的。绝对不需要。接口和实现本来就是一体两面的问题,分开来维护非常不自然,非常容易失去同步。

二、C/C++的模块引用机制。
这是一个被别人批烂了的东西,我还是要痛打落水狗的:)。简单的说,C/C++的模块引用机制是传递的。这就是说,如果模块A引用了模块B,而模块B引用了模块C的话,那么模块A也依赖于模块C了。有人会觉得这不算什么问题呀,我还正好希望这样的引用呢。可是,这会导致一个著名的问题叫做循环依赖(C/C++的引用机制决定了这叫做循环包含)。解决循环依赖的办法也不是没有,可是都不理想。方法一:维护一个依赖链表,每一个被依赖的模块都树一个旗标,表明到此一游过了,那么,下一次在到此的时候就过门而不入。这个方法的问题是,旗标一旦冲突,本来应该依赖的模块也被“过门而不入”了。方法二:编译器保证。这个方法是很好,唯一的问题是需要扩充编译器,造成不兼容的语言。当然,依赖的传递还会导致除了循环依赖以外的一大堆别的问题,模块间的依赖允许传递的话,会导致复杂的依赖图。而复杂的依赖图会导致修改传递,也就是说,一个修改影响一大片。这是很多人不愿意看到的。
是什么导致C/C++的模块引用机制如此龌龊?一切都是因为C/C++的模块引用机制是简单的文本copy机制。这个机制自然就会导致引用的传递,因而一起一大堆问题。C/C++为了避免这个问题,不得已才把模块分成两个部分以避免大多数问题,可是这个分割也有很多问题。

三、由于C++对象模型的限制,头文件中描述的接口其实不是纯接口。
这会导致对模块实现的修改也会影响一大片模块,当然,这个问题也是有办法解决的,不过不够自然。这样:

class C
{
public:
    interface element;
    ....
privte:
    impl element;
    ....
};

改成:

class C
{
public:
    interface element;
    ....
privte:
    implWarp× implWarpElement;
};

struct implWarp
{
    impl element;
    ....
};

同时,上面两个实体要分别放入两个模块,只有真正需要了解C的实现的那些模块才引用implWarp所在地模块。这样就基本上实现了接口和实现的分离,不过需要多写一些东西,而且显得非常不自然。

四、C/C++的模块及引用机制不能对不同的模块展现不同的接口。
。。。。。

我靠,越写越多,还是先歇歇吧。以后再写。
分享到:
评论

相关推荐

    从缺陷中学习C/c++

    从缺陷中学习C/C++:探索编程陷阱与成长之路 标题和描述中提及的知识点主要集中在C/C++编程中常见的缺陷、陷阱以及如何从这些错误中学习和成长。以下是对这些知识点的详细阐述: ### C/C++编程陷阱概览 在C/C++...

    日志模块(c/c++),简单、快捷,就一头文件就实现了日志模块无缝接入

    一个C/C++日志记录模块,它是对开源log4c进行的封装和修正的基础上,将所有的代码都集成到一个.h头文件中。带来的革命性突破是日志模块的使用是那么的方便和简单:只要使用一个.h头文件即可无缝的将日志模块嵌入到你...

    C/C++ 进程无模块内存注入[x86/x64]

    本文将深入探讨“C/C++ 进程无模块内存注入[x86/x64]”这一主题,涵盖Windows下的R3无模块注入技术,以及如何实现对x86和x64架构的通用支持。 首先,我们要理解什么是“进程无模块内存注入”。通常,内存注入涉及到...

    C语言/C++基础之冰墩墩源码

    C语言/C++基础之冰墩墩源码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福

    从缺陷中学习C/C++初稿

    总之,《从缺陷中学习C/C++》是一本适合所有C和C++程序员阅读的实战指南,它不仅能够帮助大家提高编程质量,还能够引导大家在编程技巧和语言理解方面取得进步。随着版本号的不断增加,书中内容也将越来越丰富和详实...

    C语言/C++基础之爱心程序源码

    C语言/C++基础之爱心程序源码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福

    C语言/C++基础之爱心源码

    C语言/C++基础之爱心源码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福

    C/C++中文文档(支持C++20和C18)和蓝桥杯C/C++组用的文档

    这个文档压缩包包含普通C/C++中文文档和蓝桥杯比赛时用的文档,C/C++中文文档是最新版,支持到C++20和C18,且包含以前版本的内容。蓝桥杯蓝桥杯C/C++组用的文档比正常文档更简略,但包含了ASCII码表。

    C语言/C++基础之跨年烟花代码

    C语言/C++基础之跨年烟花代码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福

    C语言/C++基础之圣诞树源码

    C语言/C++基础之圣诞树源码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福

    C/C++ API 帮助文档大全(中文,chm格式)

    C/C++ API 帮助文档大全是一份全面的资源,包含了C和C++编程语言的各类API接口和函数的详细信息。这份文档通常以CHM(Compiled Help Manual)格式存在,这是一种由微软开发的、用于存储HTML帮助文档的压缩格式。通过...

    C语言/C++基础之绘制图钉画源码

    C语言/C++基础之绘制图钉画源码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福

    C语言/C++基础之实现绕线画代码

    C语言/C++基础之实现绕线画代码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福

    C/C++程序设计学习与实验系统

    官方介绍:原名《Turbo C/C++ for Windows 集成实验与学习环境》,支持最新操作系统WINDOWS 7,它是从事一线教学的大学教师根据C/C++ 初学者的特点,量身定制的一个简单易用的 C/C++程序设计学习与实验软件(支持TC2/...

    C/C++详细函数大全

    《C/C++详细函数大全》是一部综合性的编程资源,涵盖了C和C++语言中的各种函数,旨在为学习者提供详尽的函数介绍、说明及代码示例。此资源源自某培训学校的教学材料,以CHM(Compiled HTML Help)格式呈现,这种格式...

    基于C语言/C++基础的跨年烟花代码

    C语言/C++基础之跨年烟花代码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福

    二维码(QRcode)生成算法 C语言/C++源码

    #二维码(QRcode)生成算法 C语言/C++ 源码 1. 根据输入字符串识别编码模式; 2. 根据输入字符串长度选择合适的QRcode版本; 3. 将编码转换为二进制位流表示为数据码字; 4. 使用多项式生成纠错码; 5. 将数据码和...

    c / c++ / cpp / stl 中文帮助文档手册chm格式下载

    C/C++ 语言参考 基本C/C++ 预处理命令 操作符优先级 转义字符 ASCII码表 基本数据类型 关键字 标准 C 库: Standard C I/O Standard C String & Character Standard C Math Standard C Time & ...

    c语言/c++/qt图形界面

    c语言/c++/qt图形界面

Global site tag (gtag.js) - Google Analytics