HppSlice:C++ 声明与实现的分离程序

软件名称:HppSlice

版本:1.0

时间:2014-11-06

作者:飞天狐

功能:

实现 C++ 头文件中实现和声明的分离。有时为了快速开发,调试,常常把代码的实现和声明放在一起。

如:

class Test{

int test()

{

....

}

};

当我们调试完一个类或程序的时候,为了发布编译好的 .lib 或 .dll 还需要把实现分离出来,以便单独把头文件发放出来。

或者为了减少以后的编译时间,我们也不希望头文件包含庞大的实现文件,所以需要把实现代码分离出来。

如果用手工实现则会相当麻烦。于是我开发了该工具用来自动化上述操作。

使用方法:

1、对于每个类,如果希望分离该类里面的某些或全部方法,则需要在类声明的上一行加上标签:///@slice,在该类的结束下一行加上标签:///@~,之间不能有空行

如:(标签单独一行,标签与类的声明之间不能有空行 )

///@slice

class Test{

...

};

///@~

2、对于每个希望被分离的方法,在方法名上一行单独一行加上标签:///@sl , 之间也不能有空行

3、运行程序,输入相应的命令及参数

4、命令及参数:

命令行/控制台 参数:

-b {dir/filename }|dir/* 恢复指定文件或指定文件夹下的文件,可以使用通配符

-s {dir/filename }|dir/* 分离指定文件或指定文件夹下的文件,可以使用通配符

注意事项:

1、由于没有实现格式检查功能,所以如果使用了不当的格式会导致分离失败,如果分离失败可以通过恢复指令复原

2、///@sl 适用的函数有比较严格的限制,要求格式如下才能使用 ///@sl 标签:

@[ret]@[email protected](param)@{impl}

@:表示空格和注释的任意组合, [] 表示可选,ret 只能是一个单个的类型如:int,但不可以是复合的如:const int, 因此在使用的时候要注意,否则可能会造成源码的损害。

如果发现分离后代码有问题,可以通过 恢复命令 -b 恢复源文件

历时:2 天

总结:

一开始构思该程序的时候认为会很简单。其实不然。主要工作如下:

1、开始的想法是把所有的实现代码分离出来,但是后来考虑到用户可能并不希望分离所有的代码,因此后来就加上了标签。这样一来用户的自主权更大,解析也会相应的变简单了。

2、开始忽略了引号及注释,导致解析失败,当考虑上了引号和注释后,开发难度有了本质的提高。因为要跳过所有的注释和引号而不解析他们。本以为直接预处理掉所有的注释,但是这样做就会得不偿失了,因为好的注释是很重要的,不能也不应该被处理掉。

3、开始实现的时候没有考虑到要把解析给分离开来,直接混杂在一起,导致程序逻辑变得复杂和难以理解,bug 也因此增多。经过多次尝试,把现在定义的接口作为最终实现的接口。(曾经考虑过定义一个文件解析类,来辅助实现,但后来没有这样做,因为很难完全封装、屏蔽掉对输入文件的操作)。经过最后的修改,不仅代码量减少了,而且程序的逻辑也变得简单明了。

4、在开发的时候最好是先想好接口,把主要逻辑实现,然后再实现接口,这样就可以及早发现接口设计是否合理。如果不合理,那重构的难度也不大。当然,对于不甚了解的知识或细节,可能要事先做可行性分析,比如可以把该细节先实现了,以防到最后才发现该细节无法实现,那时候导致的重构代价将是巨大的!因此在这里就存在一个权衡的问题了,具体问题具体分析,一切都要靠情景!

源码链接

时间: 2024-10-22 20:41:31

HppSlice:C++ 声明与实现的分离程序的相关文章

你真的了解C中的声明吗 —— 简版dcl程序

小测试看看你理解对几个: char **argv argv: pointer to char array int (*daytab)[13] daytab: pointer to array[13] of int int *daytab[13] daytab: array[13] of pointer to int void *comp() comp: function returning pointer to void void (*comp)() comp: pointer to funct

Android清单文件具体解释(二) ---- 应用程序权限声明

我们知道,Android系统的各个模块提供了很强大的功能(比方电话,电源和设置等),通过使用这些功能.应用程序能够表现的更强大.更灵活.只是,使用这些功能并非无条件的.而是须要拥有一些权限.接下来,我们就開始解说还有一个很重要的知识点--应用程序权限声明.当中主要包含应用程序的权限声明,自己定义应用程序的訪问权限和SDK版本号限定. 1.<uses-permission>--应用程序的权限申请 权限 描写叙述 android.permission.ACCESS_NETWORK_STATE 同意

Android清单文件详解(二) ---- 应用程序权限声明

我们知道,Android系统的各个模块提供了非常强大的功能(比如电话,电源和设置等),通过使用这些功能,应用程序可以表现的更强大,更灵活.不过,使用这些功能并不是无条件的,而是需要拥有一些权限.接下来,我们就开始讲解另一个非常重要的知识点--应用程序权限声明,其中主要包括应用程序的权限声明,自定义应用程序的访问权限和SDK版本限定. 1.<uses-permission>--应用程序的权限申请 权限 描述 android.permission.ACCESS_NETWORK_STATE 允许应用

云原生应用程序架构的五大特性(上)- 12要素应用

12要素的概念最早诞生于Heroku的工程师手中,说白了,其实就是云原生应用程序架构的模式集合,它描述了一个应用程序的原型,最好地诠释了采纳云原生应用程序架构的原因. 通过突出陈述性配置和水平扩展的无状态/无共享进程,以及整体上与部署环境的松耦合连接,这些模式实现了速度性.安全性和可扩展性.在当下,Cloud Foundry.Heroku和Amazon Elastic Beanstalk等云应用程序平台都已经为部署12要素应用进行了优化. 12要素视应用程序为可独立部署的单元,企业通常将多个可协

MySQL的读写分离的几种选择

MySQL的读写分离的几种选择 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 原址如下: http://heylinux.com/archives/1004.html Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步

定义与声明

C++声明和定义的区别 收藏 <C++Primer>第四版 2.3.5节中这么说到: ①变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. ②变量声明:用于向程序表明变量的类型和名字. ③定义也是声明:当定义变量时我们声明了它的类型和名字. ④extern关键字:通过使用extern关键字声明变量名而不定义它. 1.定义也是声明,extern声明不是定义,即不分配存储空间.extern告诉编译器变量在其他地方定义了. 例如:extern int i; //声

声明和定义

<C++Primer>第四版 2.3.5节中这么说到: ①变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. ②变量声明:用于向程序表明变量的类型和名字. ③定义也是声明:当定义变量时我们声明了它的类型和名字. ④extern关键字:通过使用extern关键字声明变量名而不定义它. 1.定义也是声明,extern声明不是定义,即不分配存储空间.extern告诉编译器变量在其他地方定义了. 例如:extern int i; //声明,不是定义 int i; /

函数的声明和定义的区别

函数声明和定义的区别(1) C语言编译系统是由上往下编译的.一般被调函数放在主调函数后面的话,前面就该有声明.不然C由上往下的编译系统将无法识别.正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用!函数的声明可以与定义分离,要注意的是一个函数只能被定义一次,但可以声明多次. 函数声明由函数返回类型.函数名和形参列表组成.形参列表必须包括形参类型,但是不必对形参命名.这三个元素被称为函数原型,函数原型描述了函数的接口.定义函数的程序员提供函数原型,使用函数的程序员就只需要对函

C++中的声明和定义

<C++Primer>第四版 2.3.5节中这么说到: ① 变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. ② 变量声明:用于向程序表明变量的类型和名字. ③ 定义也是声明:当定义变量时我们声明了它的类型和名字. ④ extern关键字:通过使用extern关键字声明变量名而不定义它. 1.定义也是声明,extern声明不是定义,即不分配存储空间.extern告诉编译器变量在其他地方定义了. 例如:extern int i; //声明,不是定义 int