严格地,应该说,VC6或VC2005不能很好的支持对“行数超过65536的C/C++源代码文件”的跟踪调试。
这是我(liigo)在准备参予为易语言开发最新版的sqlite3支持库的时候偶然发现的。
从 SQLite 官方网站(sqlite.org)下载的 sqlite3 最新源代码整合版(amalgamation),其中 sqlite3.c 单个文件尺寸高达 3.3M,代码总行数接近 10 万行(98715行)。用 VC6 或 VC205 编译都没有问题,关键是对该文件的跟踪调试支持非常不好:我在调用 sqlite3_initialize() (定义在 sqlite3.c 中第 83992 行处)的代码处下断点,中断后单步跟踪进入(F11),发现VC调试器已经不能准定位源代码行号了,竟然中断在一堆反汇编后的二进制代码处;而直接到 sqlite3.c 中 sqlite3_initialize() 的函数体内下断点如何呢,根本下不了断点!根据VC助手(Visual Assist X)提示,函数 sqlite3_initialize() 定义在 sqlite3.c 的第 83992 行(正确),但执行跳转动作(F12 / Alt+G)后,光标却定位到 18456 行!而数值 18456 恰恰是数值 83992 被截断为两字节后的结果!
根据合理推论,我们初步猜测,在VC6/VC2005编译器生成的调试信息中,“行号”是用两字节的“unsigned short”(而非四字节的“unsigned int”)记录的。由此造成的结果是,一旦某个C/C++源代码文件总行数超过限制(65536行),就不能很好的跟踪调试文件中65536行以后的代码。
即使猜测属实,这也仅仅只是VC6/VC2005编译器的一个小小的设计疏忽,算不得什么。当年用一个字节存储日期中的年份、用四个字节存储IPv4,也都有过先例。问题是,谁能想到,竟然在人变态到,把一个C/C++源代码文件搞那么大肚子,接近10万行?!哈哈,这种事情还实实在在地发生在 sqlite3.c 身上,虽然该文件是由程序合并(amalgamate嘛)生成的。
问题既然出现了,先想办法解决吧。OK,发现 sqlite3.c 中有很多注释,把所有注释删除是不是会减少很多行?随手写了几行易语言代码,360毫秒内就把其中的注释全部删除:
(注意,上面代码中的正则表达式在 VC6 / VC2005 / EmEditor6 中均无效,因为它们不能很好的支持多行匹配模式(存疑)。)
经过以上易语言程序的处理,sqlite3.c 的代码行数减少了接近三万行,达到 71047 行,还是大于 65536。噫,又发现该文件中有很多连续的空行,把它们去掉试试?用正则表达式把“\n\n”替换为“\n”,代码行总缩减为 64476 行,OK,够了。
把瘦身后的 sqlite3.c 交给 VC6 / VC2005 编译调试,一切正常了。(瘦身后的 sqlite3_thin.c 可在此下载,经 Beyond Compare 2.2 对比核实,未发现非注释性代码被无辜删除,但无论如何不对结果做任何担保。)
分享到:
相关推荐
标题中的“计算源代码行数源代码vc2005”指的是一个使用Microsoft Visual C++ 2005(简称VC2005)开发的程序,它的主要功能是统计指定目录下源代码文件中的有效行数、空行数以及注释行数。这种工具在软件开发中非常...
在IT行业中,源代码行数(Lines of Code, LOC)经常被用来衡量软件项目的规模,虽然这并不是评估软件质量的唯一标准,但在某些情况下,如项目预估、维护成本分析等,它还是具有一定参考价值的。这个“C++实现的源...
"代码计数器"是一款专门用于统计代码行数的工具,它可以分析源代码文件,提供各种分类统计信息,如总代码行、注释行、空行等。在VC6.0环境下,这类工具能够帮助开发者: 1. **评估项目规模**:通过统计代码行数,...
1. 使用`<filesystem>`库(C++17及更高版本)遍历目录,找出所有源代码文件。 2. 打开每个文件,逐行读取内容。 3. 对于每行,检查其是否为空行、注释行或预处理器指令,并相应增加计数。 4. 在处理完所有文件后,...
功能:Visual C++插件,提供了Visual C++源代码注解标准化与自动化功能。在它的帮助下,您可快速创建标头文件信息注解,文件中模块注解, C++处理方式,以及C语言功能与历史校正功能注解,等等。 8.FileTool ...
Microsoft Visual C++ 6.0(简称VC6.0)虽然是一款经典的IDE,但它默认并不支持显示代码行数。不过,通过安装特定的插件,我们可以使VC6.0具备这一特性。"VC显示行数插件"就是专门为了弥补这个不足而设计的。 VC6.0...
扫雷 vc 源代码 C/C++ 实现要学会MFC哦!
"Undelete文件恢复VC源代码"提供了一种自行动手恢复已删除文件的方法,这是一份使用Visual C++ 6.0(VC6.0)编写的源代码。这个项目的核心是针对NTFS(New Technology File System)磁盘文件的恢复,NTFS是Windows...
这个“hex文件转S19文件VC/MFC程序源代码.zip”是一个专门用于在Windows环境下,使用Microsoft Visual C++ (VC) 和MFC(Microsoft Foundation Classes)框架编写的程序,目的是将HEX文件转换为S19格式,以适应特定的...
Visual C++源代码 190 如何使用自动化导出Word文件Visual C++源代码 190 如何使用自动化导出Word文件Visual C++源代码 190 如何使用自动化导出Word文件Visual C++源代码 190 如何使用自动化导出Word文件Visual C++源...
Visual C++源代码 33 如何限制用户使用软件次数Visual C++源代码 33 如何限制用户使用软件次数Visual C++源代码 33 如何限制用户使用软件次数Visual C++源代码 33 如何限制用户使用软件次数Visual C++源代码 33 如何...
7. **.c和.i文件**:`.c`文件代表C语言源代码,`.i`文件是经过预处理器处理后的C/C++源代码,通常用于查看预处理结果或生成其他语言的输入,如C#。 8. `dlldata.c`:这个文件包含了注册和反注册COM组件所需的数据和...
接下来,随着微软的更新,我们有VC7.0(即VC++ .NET 2002)、VC7.1(VC++ .NET 2003)、VC8.0(VC++ 2005)、VC9.0(VC++ 2008)、VC10.0(VC++ 2010)、VC11.0(VC++ 2012)、VC12.0(VC++ 2013)、VC14.0(VC++ ...
标题“txt文件分割源代码vc6”涉及到的是一个利用Visual C++ 6(简称VC6)编写的程序,它的主要功能是对TXT文本文件进行分割。这个程序可能是一个实用工具,帮助用户处理大尺寸的TXT文件,将其拆分成多个小文件以...
本项目"统计代码行数"是专为Visual C++(VC)工程设计的一个实用工具,它能够计算源代码中的有效行数,并允许用户选择是否包含空行和注释行。 首先,我们要理解VC工程。VC++,全称Visual C++,是微软推出的一款强大...
【标题】"拼图游戏源代码(C++/VC/MFC)" 提供了一个学习和研究游戏开发的机会,特别是对于那些对使用C++、Visual C++(VC)以及Microsoft Foundation Classes(MFC)框架感兴趣的人来说。MFC是微软为Windows应用程序...
vc6、c++创建日志文件、记录日志 源代码
用Visual C++编写程序的时候,会生成一大堆的中间文件,这些文件的体积一般都十分庞大,常常都是源代码体积的数十倍以上,如果不注意清理,机子上很快就会有一大堆的中间文件。当我们想把自己的代码做一下备份时,...
在本话题中,我们主要关注如何解包ISO镜像文件,特别是涉及到VC6(Visual C++ 6.0)的源代码。 首先,我们需要理解ISO9660文件系统,它是CD-ROM标准所采用的标准文件系统。它遵循严格的跨平台兼容性设计,允许不同...
标题中的“VC&C++编写的计算程序代码量的程序”指的是一个使用Microsoft Visual C++(简称VC)开发的工具,其主要功能是统计C++源代码的行数,特别是针对大型项目,例如描述中提到的400多万行的工程。这个程序能够...