Dev-C++简介
Dev-C++ 是Windows环境下的轻量级C/C++ 集成开发环境。遵循C++ 11标准,同时兼容C++98标准。
Dev-C++ 功能简洁,易于学习和使用,但同时该软件功能不完善,存在一些问题,并且从未在商业级的软件开发中使用过,只适合于初学者和教学使用。Dev-C++ 由Orwell公司继续更新开发(现已停止),最新版本为5.11,使用GCC 4.9,上次更新时间为2015年4月。这是官方博客以及下载链接
Dev-C++现在被一些公司或者第三方开发者接手:
- Embarcadero Dev-C++,上次更新时间为2021 年1月。
- XiaoLoong Dev-C++,上次更新时间为2022年10月。
推荐使用小龙 Dev-C++。
Dev-C++的安装
Dev-C++的安装非常简单,唯一需要注意的是,如果你使用的是Windows 11系统,千万不要在语言设置里勾选Beta版:使用Unicode UTF-8提供全球语言支持。否则会出现乱码问题。
Dev-C++的使用
安装完毕之后,双击 Windows 桌面上的 Dev-C++ 图标,以启动Dev-C++。工作界面如下图所示。
工作界面如下图所示,其中依次显示有菜单栏、工具栏、左侧管理器面板、源代码编辑区和底部功能面板。
工具栏是平时使用最多的,其中各个按钮会随着当前操作而处于 明亮可用状态 或 变灰不可用状态。各个按钮的功能如下图所示(其中红色黑体表示本软件中专用的功能):
编译与运行
程序编写完成之后,点击工具栏上的“编译”按钮,就可以开始编译和连接,稍等片刻就会完成。
这时底部功能面板会自动向上展开。如果编译出错,则底部功能面板会显示“编译信息”页,其中列出了编译时的出错信息(小龙 Dev-C++ 自动地把出错信息翻译成了中文)。 上图中的示例程序在编译后出现的情况如下图所示:
初学者在编写程序时经常会出现语法错误,程序编译时通常能检测出各种语法错误。上图中的出错信息是“[错误] 期待 ‘;’ 在此之前:’return’”,它是按照英文逐词翻译的,实际意思是“期待在 ‘return’ 之前有 ‘;’ 字符”。
应该根据编译出错信息,相应地修改程序。
然后再次点击工具栏上的“编译”按钮,重新进行编译。编译成功时,底部功能面板的“编译日志”页中显示了详细的编译信息。在下图中,编译日志中显示,上面的程序已经编译成功,生成了可执行文件 “D:\progs\hello.exe”。
然后可以点击工具栏上的“运行”按钮(有时为了省事,可以直接点击工具栏上的“编译运行”按钮),以便运行程序。
程序运行时会自动弹出控制台窗口,在其中显示有程序输出结果。如下图所示。
上图中还显示了一行英文“Process exited after 0.021 seconds with return value 0”,其含义是“运行当前程序的进程在 0.021 秒钟之后退出,返回值为 0”。 后面还写有“请按任意键继续…”,建议读者按回车链,以关闭这个窗口,返回到源程序编辑窗口。
小结:
- 点击工具栏上的“新建”按钮可以新建一个源程序文件,然后点击“插入代码块”按钮,点击“C main”或“C++ main”可以插入基本的程序代码块,开始编辑自己的源程序。
- 点击“保存”按钮可以保存源程序。要选择一个合适的文件夹用于保存源程序文件。
- 点击“编译”按钮可以编译源程序,如果出现错误信息,就要相应地修改源程序,然后再次编译。如此操作,直到编译成功。
- 点击“运行”按钮可以运行程序。
简单的程序调试和除错
在编写程序时经常会出错,这些错误可以大致地分为语法错误和逻辑错误。程序编译时通常能检测出各种语法错误,这时编程者需要根据出错信息,找出程序中的语法错误,修改程序并消除语法错误,重新编译,如果操作,直到编译成功,生成可执行程序。然后就可以运行所生成的可执行程序。
但是,即使程序能够运行,也并不意味着它就是正确的,我们需要仔细分析程序运行结果,看是否符合预期。如果不符合预期,很有可能是程序中还含有逻辑错误,需要修改程序并消除其中的逻辑错误。
下面通过一个稍微复杂的程序来演示如何对程序进行除错。
请读者点击工具栏上的“打开”按钮,找到小龙Dev-C++安装目录(通常是“C:\Program Files (x86)\Dev-Cpp\”)下的“Example”目录,打开其中的“debug-sum100.cpp”,其内容如下图所示:
点击工具栏上的“编译”按钮,对这个程序进行编译,结果如下图所示:
上图中的出错信息是“[错误] ‘k’ 未在此范围内声明”,这是一个语法错误,需要修改程序,在其中定义变量 k(例如该行修改为“int k = 0”)。
排除了所有语法错误之后,再次进行编译。编译成功时,会生成了可执行文件 “debug-sum100.exe”。
(偶尔有读者发现编译时出现错误信息,报告说无法保存文件,那是因为当前用户在该程序所在目录下没有保存文件的权限。请点击菜单“文件”下的“另存为”,把程序文件保存到另外某个文件夹(例如“我的文档”或“桌面”),然后再进行编译。)
然后点击“运行”按钮,程序运行时会自动弹出控制台窗口,在其中显示有程序输出结果。
请注意,图中的输出结果是 4950 。根据数学知识可知,从 1 累加到 100 的结果应该是 5050,所以这个答案是错误的,这说明上面的程序虽然可以运行并输出结果,但是其中还存在着逻辑错误,需要进行调试,以排除错误。
要想清除程序中的逻辑错误,就必须学会一些调试方法,通过观察变量的数值变化,加上自己的逻辑思考,从而找出程序中的错误所在并修改清除之。
一种基本的办法是在程序中添加输出语句,输出运行过程中的变量的中间值。
在上面示例程序中,可以在循环中添加语句,输出变量 k 和 sum 在循环过程中的值。如上面示例程序中的循环结构内的注释语句所示。请去掉行首的行注释标记“//”,使它成为正式语句。
再次编译并运行程序,可以发现输出了一系列数据,如下图所示:
仔细查看输出的数据,可以发现,上面程序只是从 1 累加到 99,所以累加结果是4950 !要解决这个程序中的错误,就需要把 for 循环中的“k < 100”改为 “k <= 100”。重新编译并运行,就会发现,程序最终输出结果是 5050,这是从 1 累加到 100 的正确结果。
小结:
- 即使程序能运行,也需要仔细查看运行结果,判断运行结果是否符合预期。如果不符合预期,有可能是程序中含有逻辑错误。
- 可以在程序中添加输出语句,输出运行过程中的变量的中间值。观察变量的值的变化情况,判断程序错误的原因,然后修改程序消除错误。
Dev-C++的调试和除错
上面程序通过输出运行过程中的变量的中间值可以找出问题并排错,但是有些程序的错误可能比较隐藏比较深,这时就需要更复杂一点的方法,也就是使用集成开发环境所提供的排错和调试工具。
Dev-C++ 提供了强大的调试工具,下面用一个含有错误的示例程序来介绍具体使用方法。
请读者打开Dev-C++ 安装目录下的的“Example”目录下的程序文件“debug-number.cpp”。这个程序的功能是让用户输入一个整数,然后分解出该整数的各位数字并累加起来,最后输出各位数字之和。这个程序中含有错误的程序,可供下面进行调试和除错操作。
- 点击“编译”按钮,它能正常完成编译,生成可执行程序。
- 点击“运行”按钮,该程序就会开始运行,要求用户输入一个整数。用户输入一个整数(例如 512 )并按回车键之后,程序会显示“n = 512”,然后就长时间保持该状态,没有数据输出。实际上是因为该程序中出现了死循环。请在控制台窗口中按下 Ctrl + Break 键,以结束该程序的运行,回到编辑窗口。
要解决该程序中的问题,可以使用前文介绍的方法,在程序中添加输出语句,输出运行过程中的变量的中间值。不过我们这里来练习使用Dev-C++中的调试和除错功能。
Dev-C++ 的工具栏上与调试有关的按钮是“调试”、“停止”、“下一行”、“单步进入”和“跳出函数”。初学调试时需要使用“调试”、“停止”和“下一行”这三个按钮。
开始调试:点击工具栏上的“调试”按钮(快捷键 F5),或点击菜单“运行”下的“调试 F5”即可开始调试。 程序界面如下图所示:
启动调试之后,弹出了控制台窗口,而 Dev-C++ 的源代码编辑框中出现了一个蓝色横条,它表示当前即将执行的代码行。此外,Dev-C++ 左侧管理器面板自动切换到“调试”窗格,其中显示上下两个文本框,下方文本框中自动显示当前函数中的函数参数的值和局部变量的值。普通用户只需要关注下方文本框即可。
在上图中可以看到,启动调试时,左边“调试”窗格中显示了局部变量 n、k 和 sum 的值。上图中的值可能与读者实际看到的有差异,这是因为刚进入函数时,所有局部变量都只是被分配了存储空间,还没有被赋值。读者不要为此感到惊奇。
在调试过程中,需要熟练使用工具栏上的“下一行”按钮(快捷键 F7)。该按钮的功能是:执行当前代码行,然后蓝色横条跳到下一行(表示该行是即将执行的代码行)。
- 点击“下一行”或按 F7 键,在侧边管理器面板中可以看到,sum 被赋初值 0。
- 点击“下一行”或按 F7 键,控制台窗口中输出字符串”input a int number: “。请切换到控制台窗口中观察,然后切换回到 Dev-C++ 窗口。
- 点击“下一行”或按 F7 键,控制台窗口中等待用户输入数据。这时读者需要切换到控制台窗口,在其中输入一个整数(例如 512)并按回车键。然后再切换回到 Dev-C++ 窗口。在侧边管理器面板中可以看到 n 的值已经是读者所输入的值了。
- 点击“下一行”或按 F7 键,控制台窗口输出”n = 512″(其中的数字就是刚才输入的整数)。
- 继续点击“下一行”或按 F7 键,程序就进入了 while 循环。
这时,用户可以继续不断地点击“下一行”或按 F7 键,同时眼睛观察左侧管理器面板中显示的局部变量 n、k 和 sum 的值,然后思考它们的变化是否符合预期?仔细思考可以发现,源程序“k = n / 10;”的功能并不是注释所希望的“求出个位数”!而“n = n % 10;”的功能也不是注释所希望的“除以 10”!总之,其实就是把除法运算符 / 与取余运算符 % 刚好搞反了!
点击“停止”按钮或按 F6 键,停止运行。改正源程序中的除法运算符 / 和取余运算符 % 的用法,再编译运行,程序的运行结果就符合预期了。
小结:
- 判断程序运行有问题,需要通过调试来排除错误。点击“调试”按钮或按快捷键F5,开始调试。
- 继续点击“下一行”或按 F7 键,执行当前代码行,然后蓝色横条跳到下一行(表示该行是即将执行的代码行)。
- 观察侧边管理面板的“调试”选项卡中所显示的当前函数中的函数参数的值和局部变量的值。思考程序中的错误原因。
- 点击“停止”按钮或按 F6 键,停止运行。
复杂程序的调试和除错
本节介绍在较为复杂的程序中如何进行程序调试和除错。请打开 Dev-C++ 安装目录下的“Example”文件夹中的程序文件“debug-average.cpp”。
该程序中含有一个名为“average”的函数,用于求出长度为 length 的整型数组 array[] 的平均值。在主函数中提供了一个示例数组 a ,并调用 average 函数求平均值。
该程序可以通过编译并正常运行,有输出结果。但是手工简单计算可知,数组 a 中现有的数据的平均值大约是 80.7 ,但是程序输出结果不正确。 所以需要进行调试和除错。
点击“调试”按钮或按 F5 键,启动调试,程序界面如下图所示:
在上图中可以看到,启动调试时,左边“调试”窗格中显示了局部数组变量 a 、局部变量 len 和局部变量 avrg 的值为一些奇怪的莫名其妙的的数字。这是因为刚进入函数时,所有局部变量都只是被分配了存储空间,还没有被赋值。所以查询其值就得到一个毫无意义的数字。读者不要为此感到惊奇。然后需要熟练使用工具栏上的“下一行”按钮(快捷键 F7)和“单步进入”按钮(快捷键 F8)。在简单的只含有一个 main 函数的程序中,这两个按钮的功能是相同的,没有区别。而在含有多个自定义函数的程序中,这两个功能有较大的区别:“下一行”是指把当前语句作为一步执行完毕,而“单步进入”是指如果当前语句中含有函数调用则追踪进入到函数中去执行。
如果调用函数是标准函数或你认为无误的函数,就用“下一行”执行(以免追踪进入到函数中),对于怀疑有问题的函数才用“单步进入”去追踪。如果一不小心进入了标准函数(例如 printf 函数或“cout << endl;”输出),则点击“跳出函数”以返回。
在启动了调试之后,读者可以使用“下一行”按钮和“单步进入”按钮,慢慢地在调试状态下执行程序中的语句,并随时观察左边“调试”窗格中所显示的值,并且不断地思考程序中的语句是否正确,发现有误时进行改正。
对于上面程序,在进入到 average 函数中之后,比较容易发现,其中一个问题是其中的局部变量 sum 没有赋初值!
这时请点击工具栏上的“停止”按钮(快捷键 F6 ),返回到编辑状态,把局部变量 sum 赋初值为 0,然后点击“编译”按钮重新进行编译,再点击“运行”按钮运行程序,或点击“调试”按钮启动调试。(以后在调试过程中可以随时点击“停止”按钮返回编辑状态,对源代码进行修改之后需要重新编译,再运行程序或启动调试)
运行程序会发现结果仍然不正确,所以需要重新启动调试。分析可知,这时需要检查 for 循环中的情况。检查时会逐渐注意到,虽然左边“调试”窗格中随时会显示 k 和 sum 的值,但是应该观察 array[k] 才行!但是左边“调试”窗格中并没有显示这个数组元素的值。
这时需要使用“查看变量的值”的功能。在默认情况下,如果用鼠标悬浮在当前运行的代码中的变量上方(例如上面程序中的 array[k] ),则会自动出现一个小悬浮窗口,显示出该变量当前的值。
如果想更快速地看到变量的值,可以在编辑器中选中待查看的变量名(例如,选中“array[k]”),在左侧“调试”面板中点击“添加查看”按钮,就可以在 Dev-C++ 窗口左边的“调试”窗格中看到该变量及其当前的值。(如果未选中变量名而点击该按钮,就会弹出对话框让用户输入待查看的变量名)
在上面程序中添加了查看变量 array[k] 之后,用“单步进入”逐句执行该程序,并随时观察变量 k 和数组元素 array[k]的值,最后会观察到,当 k 的值为 8 和 9 时仍然进入了循环!这是一个数组下标越界错误(主函数中的数组 a 只有 8 个变量,下标为 0 – 7。数组长度值 len 传递给函数 average 的参数 length,循环变量 k 最大只能取值为 7)。 应该把 “k <= length + 1”修改为 “k < length”,这样才能避免下标越界,求得正确的 sum 值。
在上面的调试过程中,每次都使用“下一行”按钮(F7)和“单步进入”按钮(F8)进行操作时比较慢。这时可以在程序中设置断点,加快调试操作速度。
在事先对程序的运行出错现象进行思考之后,可以推断出程序出错的可能原因在于源代码中的哪些语句。无论是在编辑状态还是在调试过程中,可以把光标移动到想要暂停执行的那一行,用鼠标点击该行左边的装订区位置中的行号(或者按 F4 键),该行就会变成红色,装订区的行号处显示有一个红点,表示该行已被设置为一个断点。再次操作则取消该行为断点。
可以直接在“sum += array[k];”那一行设置一个断点,也可以在自己怀疑有问题的程序片段前后设置多个断点,以便进行调试。
在程序中设置了断点之后,启动调试时会直接运行到第一个断点处(而不是第一条可执行语句)暂停。这时仍然可以用“下一行”按钮(F7)和“单步进入”按钮(F8)进行操作。如果认为程序中某一部分无误,则点击“调试”按钮(这个按钮在第一次点击时是启动调试,调试过程中点击它是继续调试)就会继续运行到下一个断点处暂停,无断点则运行到程序末尾结束。
对上面的示例程序继续调试,可以发现语句“return sum / k;”含有错误:整数相除得到整数,丢失了小数部分。一种修改办法是改成“return 1.0 * sum / k;”。
这样,通过启动 Dev-C++ 中的调试功能,使用“下一行”(F7)和“单步进入”(F8)慢慢地执行程序,在此过程中随时查看变量的值,并在头脑中进行分析思考,从而判断程序中是否存在逻辑错误,从而修改程序、排除程序中的错误。
小结:
- 在调试过程中,“下一行”(F7)是指把当前语句作为一步执行完毕,而“单步进入”(F8)是指如果当前语句中含有函数调用则追踪进入到函数中去执行。
- 在调试过程中,如果需要查看的变量或数组元素的值没有自动显示在左侧管理器面板中,可以手工添加表达式进行查看。
- 在调试过程中,如果使用“下一行”和“单步进入”的速度太慢,可以设置断点,然后点击“调试”按钮或 F5 键,可以继续运行,直到下一个断点暂停。
总结一下Dev-C++ 使用过程中调试过程中经常用到的功能及其快捷键:
- 设置断点 F4
- 启动/继续调试 F5
- 停止 F6
- 下一行 F7
- 单步进入 F8
- 编译 F9
- 运行 F10
- 编译运行 F11
熟记这些快捷键有利于加快操作速度。
项目开发
Dev-C++ 不仅支持单文件开发(适合大部分初学者),还支持以项目形式的多文件开发。
点击菜单“文件 > 新建… > 项目”,或点击工具栏上的“新建…”按钮再点击“项目”,就可以打开“新建项目”对话框。该对话框中按照“基本”、“多媒体”、“Windows”和“终端窗口”四类提供了多种项目模板,可供用户从中选择合适的项目模板,开始自己的项目开发。例如,在“基本”类别中包含了“Windows应用程序”、“终端窗口应用程序”、“静态库”和“动态库”等,而在“多媒体”类别下面提供了分别使用 Direct3D、EGE 和 OpenGL 三种图形函数库进行图形编程的模板。
在使用项目方式进行多文件开发时,编辑窗口左边的“项目”窗格提供了相应的项目组织功能。