尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

C/C++图形编程入门:使用EasyX图形库快速上手图形界面开发

C/C++图形编程入门:使用EasyX图形库快速上手图形界面开发 1. 项目概述为什么选择EasyX作为你的第一个图形库如果你刚开始学习C或C并且对黑乎乎的控制台窗口感到厌倦想亲手画出点东西那么EasyX几乎是为这个场景量身定做的。它不是像OpenGL或DirectX那样的工业级图形引擎而是一个纯粹的、面向初学者的图形库。它的核心价值在于让你能用最熟悉的C/C语法以极低的学习成本瞬间将控制台程序变成一个可以画图、显示图片、甚至制作简单动画的图形窗口。这就像给你的编程工具箱里加了一把瑞士军刀虽然功能不如专业工具强大但胜在轻便、易用能立刻解决“从无到有”的问题。我见过很多新手在学完基础语法后面对“如何做出一个带界面的程序”这个问题时会感到迷茫。Qt、MFC这些框架学习曲线陡峭而EasyX则提供了一个完美的“中间站”。它让你不必立刻陷入复杂的窗口消息循环、事件处理和多线程中而是专注于图形绘制本身的逻辑。通过它你可以快速验证算法比如排序算法的可视化、制作课程设计比如学生成绩管理系统带个饼图、或者开发一个简单的2D小游戏比如贪吃蛇、俄罗斯方块。它的API设计非常直观比如circle(100, 100, 50)就能画一个圆这种即时反馈对保持学习热情至关重要。2. 环境准备与绘图窗口的创建2.1 开发环境的选择与配置EasyX的官方支持环境是Visual Studio。对于初学者我强烈建议从Visual Studio 2022 Community版开始它是免费的并且安装包自带了你所需的大部分C开发组件。在安装时记得勾选“使用C的桌面开发”工作负载这会包含必要的编译器和库文件。当然如果你偏爱轻量级编辑器也可以尝试在VSCode中配置但这需要手动设置包含路径和链接库对新手来说是个不小的挑战。在VS的环境下EasyX的集成是无缝的你只需要下载一个头文件和一个库文件复制到指定目录即可整个过程不超过一分钟。注意网络上有些教程会提到在Code::Blocks或Dev-C中使用EasyX这些方法要么需要老版本的库要么配置过程繁琐且不稳定。为了减少不必要的麻烦在入门阶段请坚定地使用Visual Studio。这能确保你的学习精力集中在图形编程本身而不是和环境问题作斗争。安装EasyX库本身非常简单。访问其官方网站下载对应你Visual Studio版本的安装包例如针对VS2022的版本。运行安装程序它会自动检测你的VS安装路径并将graphics.h等头文件和必要的库文件部署到正确的位置。安装完成后你不需要进行任何额外的项目属性配置。新建一个空项目在源代码文件中直接#include graphics.h如果编译通过就说明环境配置成功了。这一步的顺畅是EasyX设计哲学的直接体现——让开发者专注于创作。2.2 初始化绘图窗口你的数字画布一切图形绘制都始于一个窗口。在EasyX中我们使用initgraph函数来创建这个窗口你可以把它想象成初始化一块数字画布。#include graphics.h // 包含EasyX图形库头文件 #include conio.h // 用于_getch()函数等待按键 int main() { // 初始化一个640像素宽、480像素高的图形窗口 initgraph(640, 480); // 在这里编写你的绘图代码 // ... _getch(); // 等待用户按任意键防止窗口一闪而过 closegraph(); // 关闭图形窗口 return 0; }这段代码是每个EasyX程序的起点。initgraph(640, 480)创建了一个窗口其客户区即可绘制区域大小为640x480像素。原点(0,0)位于窗口的左上角X轴向右延伸Y轴向下延伸这是计算机图形学中常见的坐标系。closegraph()则是与之对应的清理函数用于释放窗口占用的资源。中间的_getch()是一个很实用的技巧它让程序暂停等待你按下任意键这样你就有足够的时间观察你画出的图形否则窗口会在main函数结束时立即关闭你可能什么都看不到。initgraph函数实际上有更丰富的参数。它的完整原型是void initgraph(int width, int height, int flag NULL);。第三个参数flag可以用来指定窗口的样式。例如SHOWCONSOLE在创建图形窗口的同时保留并显示控制台窗口。这在调试时非常有用你可以用printf在控制台输出变量值。NOCLOSE禁用图形窗口标题栏上的关闭按钮防止用户误关。NOMINIMIZE禁用最小化按钮。你可以通过按位或操作|来组合这些标志例如initgraph(640, 480, SHOWCONSOLE | NOCLOSE)。在实际项目中尤其是需要调试时SHOWCONSOLE是我最常使用的标志。它能让你在不打断图形渲染流程的情况下实时观察程序内部的逻辑状态。2.3 窗口操作与基础交互创建窗口后你可能会需要一些基本的控制。closegraph()我们已经见过了。另一个有用的函数是cleardevice()它可以清空整个绘图窗口将其填充为当前背景色默认为黑色。这在制作动画时至关重要你需要在绘制新的一帧前清掉旧的内容。虽然EasyX主要关注绘图但它也提供了一些简单的消息获取函数例如kbhit()用于检测是否有按键输入GetMouseMsg()可以获取鼠标消息。这些函数为增加交互性提供了可能。例如你可以写一个循环在每次循环中检测鼠标位置并在鼠标位置画一个点这样就实现了一个简单的“画笔”功能。这些交互功能虽然简单但足以让你理解事件驱动编程的基本概念为后续学习更复杂的GUI框架打下基础。3. 基本图形绘制从点到面有了画布我们就可以开始作画了。EasyX提供了一系列函数来绘制基础几何图形这些函数的共同特点是直观参数通常直接对应图形的几何属性。3.1 绘制点、直线与矩形点是图形的基本单元。putpixel(int x, int y, COLORREF color)函数在指定坐标(x, y)处画一个指定颜色的点。COLORREF是Windows中表示颜色的类型我们稍后会详细讲解。例如putpixel(320, 240, RED)会在屏幕中心画一个红点。直线的绘制使用line(int x1, int y1, int x2, int y2)。它从点(x1, y1)到点(x2, y2)画一条直线使用当前设置的线条颜色和样式。例如line(100, 100, 200, 200)会画一条从(100,100)到(200,200)的斜线。矩形的绘制有两个常用函数rectangle(int left, int top, int right, int bottom)绘制一个空心矩形其左上角为(left, top)右下角为(right, bottom)。fillrectangle(int left, int top, int right, int bottom)绘制一个实心矩形并用当前填充颜色填充内部。这里有一个非常重要的细节在EasyX的默认设置下这些图形绘制函数使用的坐标是“像素中心”模型。对于rectangle(100, 100, 200, 200)它实际绘制的矩形边框会占据从x99.5到x200.5y99.5到y200.5的范围。这意味着一个宽度为100像素的矩形其右边界在像素坐标200处是“半占据”的。这个特性在绘制精细图形或进行像素级操作时需要留意。对于大多数入门应用你可以暂时忽略这个细节但知道它的存在有助于你理解为什么有时两个紧挨的矩形边框看起来会粗细不一。3.2 绘制圆形、椭圆与多边形圆形通过circle(int x, int y, int radius)绘制其中(x, y)是圆心坐标radius是半径。对应的fillcircle函数用于绘制实心圆。椭圆通过ellipse(int left, int top, int right, int bottom)绘制。它绘制一个由外接矩形(left, top, right, bottom)定义的椭圆。同样fillellipse用于实心椭圆。理解椭圆参数的关键在于它是由一个“包围盒”来定义的而不是直接的中心点和轴长。多边形的绘制稍微复杂一些使用polygon(const POINT *points, int num)。你需要先定义一个POINT结构体的数组其中POINT是Windows定义的结构包含x和y两个成员。将多边形的各个顶点坐标按顺序存入这个数组然后连同顶点数量一起传给polygon函数。fillpolygon用于填充多边形。这里有一个关键陷阱多边形必须是“简单多边形”即边不能自相交且顶点必须按顺时针或逆时针顺序给出否则填充可能会出现异常。实操心得在绘制复杂图形或由多个基本图形组成的图案时我习惯先在一张草稿纸上画出坐标系标出关键点的坐标。对于对称图形可以先计算出一半的坐标再利用循环和对称性生成全部。例如画一个五角星可以先计算出一个顶点的坐标然后通过旋转公式计算出其他顶点这比手动计算所有十个顶点的坐标要可靠和高效得多。3.3 颜色与样式设置在绘制任何图形前设置好颜色和样式是必不可少的。EasyX使用COLORREF类型表示颜色最常用的方式是RGB(red, green, blue)宏三个参数取值范围都是0-255。例如RED实际上是RGB(255,0,0)的宏定义WHITE是RGB(255,255,255)。设置颜色的函数主要有两个setlinecolor(COLORREF color)设置当前线条颜色。之后所有绘制空心图形的线条都会使用这个颜色。setfillcolor(COLORREF color)设置当前填充颜色。之后所有绘制实心图形的内部填充都会使用这个颜色。setbkcolor(COLORREF color)设置背景颜色。注意它不会立即改变窗口颜色需要调用cleardevice()后才会生效。除了颜色你还可以设置线条样式使用setlinestyle(int style, int thickness 1, const DWORD *puserstyle NULL, DWORD userstylecount 0)。其中style可以是实线(PS_SOLID)、虚线(PS_DASH)、点线(PS_DOT)等。thickness是线条粗细以像素为单位。例如setlinestyle(PS_DASH, 2)会设置当前线条为2像素粗的虚线。这个功能在绘制图表、区分不同线条时非常有用。4. 文字绘制与信息输出图形界面离不开文字。EasyX提供了在图形窗口上输出文字的功能这比控制台的printf直观得多可以直接将文字作为图形元素放置在任意位置。4.1 文本输出基础最基本的文本输出函数是outtextxy(int x, int y, LPCTSTR str)。它在指定坐标(x, y)处开始输出字符串str。这里的坐标(x, y)对应的是文本字符串左上角的位置。例如settextcolor(RED); // 设置文字颜色为红色 outtextxy(100, 50, LHello, EasyX!); // 在(100,50)处输出文字需要注意的是EasyX默认使用Unicode宽字符所以字符串字面量前需要加L前缀或者使用_T()宏来保证兼容性。这是很多新手容易忽略导致编译错误的地方。除了直接输出你还可以使用settextstyle函数来设置文字的字体、高度、宽度等属性。这个函数参数较多一个典型的用法是settextstyle(25, 0, L楷体);这表示设置文字高度为25像素宽度由系统自动计算第二个参数为0字体为“楷体”。你可以通过改变字体名称来尝试系统中安装的各种字体。4.2 格式化输出与数字显示在实际项目中我们经常需要输出变量的值比如分数、坐标、计数器等。outtextxy只能输出字符串所以我们需要先将数字格式化成字符串。这里有两种主流方法方法一使用C库函数sprintf_s或swprintf_s更安全。int score 95; TCHAR str[64]; // TCHAR是一个自适应字符类型在Unicode下是wchar_t swprintf_s(str, _countof(str), L得分: %d, score); // 格式化 outtextxy(100, 100, str); // 输出这种方法灵活强大可以控制格式如小数位数、对齐等但需要预先分配一个足够大的字符数组。方法二使用C的std::to_wstring仅C。int score 95; std::wstring str L得分: std::to_wstring(score); outtextxy(100, 100, str.c_str());这种方法更现代、更安全无需担心缓冲区溢出是C项目中的首选。注意事项文字输出的性能。如果你在动画的主循环中每帧都进行大量的文本格式化与输出比如显示每秒帧数FPS这可能会成为性能瓶颈。一个优化技巧是如果显示的内容不是每帧都变化就不要每帧都重新格式化和输出。可以设置一个标志位只有当数值发生变化时才更新屏幕上的文字。另一个技巧是可以将固定不变的文本如“得分”和变化的数字部分分开绘制只重绘数字部分所在的矩形区域这需要用到“局部重绘”的技术涉及更高级的图形操作。4.3 文本对齐与高级排版默认情况下文字是从给定的(x,y)点向右下角展开的。有时我们需要让文字以某个点为中心对齐或者右对齐。EasyX提供了settextalign函数来实现这一点。它通过两个标志位来控制水平和垂直对齐方式水平对齐TA_LEFT左对齐默认、TA_CENTER居中、TA_RIGHT右对齐。垂直对齐TA_TOP顶部对齐默认、TA_BASELINE基线对齐、TA_BOTTOM底部对齐。例如如果你想在屏幕中心(320,240)显示一段居中的文字可以这样做settextcolor(WHITE); settextalign(TA_CENTER | TA_TOP); // 水平居中垂直顶部对齐 outtextxy(320, 240, L居中标题);注意设置了对齐方式后outtextxy中的坐标(x,y)就不再是文字左上角了而是对齐的“锚点”。对于TA_CENTER | TA_TOP这个点就是文字顶部水平方向的中点。对于多行文本EasyX没有内置的自动换行函数。你需要自己计算字符串长度可以用gettextwidth函数获取指定字符串在當前字体下的像素宽度然后根据窗口宽度手动插入换行符\n并多次调用outtextxy。这是一个很好的练习能让你深入理解字体渲染和布局的基本原理。5. 综合案例绘制一个简单的仪表盘现在让我们把前面学到的所有知识融合起来创建一个简单的综合案例绘制一个模拟的速度仪表盘。这个案例会用到窗口创建、圆形、扇形、直线、文字输出和颜色设置。5.1 设计思路与坐标计算我们的目标是画一个半圆形的仪表盘有刻度、指针和数字显示。假设仪表盘显示速度范围是0-220 km/h。确定画布和中心我们使用640x480的窗口。仪表盘的中心点可以设为(320, 300)这样下方留出空间显示数字。绘制外框以中心点为圆心画一个半径200的大圆弧从-135度到-45度以模拟半圆。这可以用arc或pie函数配合角度计算来实现。为了简单我们画一个完整的圆作为外圈。绘制刻度在圆弧上等间距地标记主要刻度如0, 40, 80, ... , 220和次要刻度。这需要用到三角函数。对于一个半径为r的圆圆上角度为angle弧度制的点的坐标是x center_x r * cos(angle)y center_y r * sin(angle)我们需要将角度从我们习惯的“时钟12点方向为0度顺时针增加”转换到数学上的“X轴正方向为0度逆时针增加”。通常我们会定义start_angle -150度左端和end_angle -30度右端。绘制指针指针是从圆心指向当前速度值对应角度的一条粗线段。我们需要根据当前速度值speed0-220计算出对应的角度pointer_angle然后计算指针末端的坐标并画线。绘制文字在刻度旁标注数字在仪表盘中央或下方显示当前速度值。5.2 分步实现代码解析以下是核心实现代码并附有详细注释#include graphics.h #include conio.h #include math.h // 用于sin, cos函数 #include string #define PI 3.14159265358979323846 int main() { initgraph(640, 480, SHOWCONSOLE); // 创建窗口并保留控制台用于调试 setbkcolor(BLACK); // 设置背景色为黑色 cleardevice(); // 用背景色清空窗口 // 仪表盘参数 int center_x 320; int center_y 300; int radius 200; int speed 125; // 当前速度示例值 // 1. 绘制仪表盘外圈两个同心圆模拟厚度 setlinecolor(LIGHTGRAY); setlinestyle(PS_SOLID, 3); circle(center_x, center_y, radius); circle(center_x, center_y, radius - 10); // 2. 绘制刻度线和数字 setlinestyle(PS_SOLID, 1); settextcolor(LIGHTGRAY); settextstyle(20, 0, _T(宋体)); int start_angle -150; // 刻度起始角度度 int end_angle -30; // 刻度结束角度度 int major_step 20; // 主刻度间隔km/h int minor_step 5; // 次刻度间隔km/h for (int value 0; value 220; value minor_step) { // 计算当前值对应的角度转换为弧度 double angle_ratio (double)(value) / 220.0; // 值在总范围内的比例 double angle_degree start_angle angle_ratio * (end_angle - start_angle); double angle_radian angle_degree * PI / 180.0; // 计算刻度线起点在圆上和终点向内一点 int x1 center_x (int)(radius * cos(angle_radian)); int y1 center_y (int)(radius * sin(angle_radian)); int tick_length (value % major_step 0) ? 20 : 10; // 主刻度长次刻度短 int x2 center_x (int)((radius - tick_length) * cos(angle_radian)); int y2 center_y (int)((radius - tick_length) * sin(angle_radian)); line(x1, y1, x2, y2); // 绘制刻度线 // 如果是主刻度在旁边标注数字 if (value % major_step 0) { // 数字的位置在刻度线再向外一点 int text_x center_x (int)((radius - 35) * cos(angle_radian)); int text_y center_y (int)((radius - 35) * sin(angle_radian)); settextalign(TA_CENTER | TA_BASELINE); TCHAR str[10]; swprintf_s(str, _countof(str), _T(%d), value); outtextxy(text_x, text_y, str); } } // 3. 绘制指针 double speed_ratio (double)speed / 220.0; double pointer_angle_degree start_angle speed_ratio * (end_angle - start_angle); double pointer_angle_radian pointer_angle_degree * PI / 180.0; int pointer_x center_x (int)((radius - 30) * cos(pointer_angle_radian)); // 指针末端 int pointer_y center_y (int)((radius - 30) * sin(pointer_angle_radian)); setlinecolor(RED); setlinestyle(PS_SOLID, 5); // 粗指针 line(center_x, center_y, pointer_x, pointer_y); // 从圆心画到末端 // 在圆心画一个小圆盖住指针根部 setfillcolor(DARKGRAY); fillcircle(center_x, center_y, 10); // 4. 在仪表盘中央显示当前速度 settextcolor(YELLOW); settextstyle(40, 0, _T(Arial Bold)); settextalign(TA_CENTER | TA_BASELINE); TCHAR speed_str[20]; swprintf_s(speed_str, _countof(speed_str), _T(%d km/h), speed); outtextxy(center_x, center_y - 50, speed_str); // 5. 添加标题 settextcolor(WHITE); settextstyle(25, 0, _T(楷体)); outtextxy(center_x - 100, 50, _T(车速仪表盘)); _getch(); closegraph(); return 0; }5.3 案例优化与扩展思路这个基础版本已经能工作了但我们可以让它更好添加颜色渐变可以让仪表盘从绿色低速渐变到红色高速。可以在绘制刻度线时根据value的大小计算一个颜色例如使用RGB(0, 255- value, value)进行简单的插值然后用setlinecolor设置。让指针动起来将speed变量放在一个循环里并随时间递增或递减在每次循环中清屏(cleardevice())并重绘整个仪表盘就可以实现动画效果。注意控制重绘频率可以使用Sleep()函数。增加交互用kbhit()检测键盘输入按上/下键增加/减少速度实现手动控制。抗锯齿EasyX默认的绘图没有抗锯齿线条在斜向时会有锯齿感。可以尝试使用setlinestyle中更高级的样式或者自己实现一个简单的Wu抗锯齿画线算法这是一个很好的进阶练习。通过这个案例你将深刻体会到图形编程就是将数学计算坐标、角度、比例通过图形API视觉化的过程。每一步计算都直接对应着屏幕上的一个像素这种“所见即所得”的编程体验正是图形编程最初的魅力所在。6. 常见问题与排查技巧实录即使按照教程一步步操作新手在入门EasyX时也难免会遇到一些“坑”。下面是我在学习和教学过程中总结的一些最常见问题及其解决方法。6.1 编译与链接错误问题1无法打开源文件 “graphics.h”或undefined reference to ‘initgraph’原因这是最典型的环境配置问题。说明编译器找不到EasyX的头文件或库文件。排查确认你是否正确安装了对应你Visual Studio版本的EasyX。VS2019和VS2022需要的库版本不同。在VS中检查项目属性。右键点击项目 - 属性 - 配置属性 - VC目录。在“包含目录”中确保包含了EasyX头文件所在路径通常是C:\Program Files (x86)\EasyX下的include文件夹。在“库目录”中确保包含了EasyX库文件所在路径同上是lib文件夹。对于undefined reference链接错误还需要在“链接器 - 输入 - 附加依赖项”中添加对应的.lib文件名如easyx.lib或easyxw.lib取决于你是否使用Unicode。最简方案对于使用官方安装包的用户通常只需安装即可无需手动配置项目属性。如果出错尝试完全卸载EasyX重新下载对应VS版本的安装包并以管理员身份运行安装。问题2“outtextxy”: 无法将参数 3 从“const char [13]”转换为“LPCTSTR”原因字符编码不匹配。EasyX默认使用Unicode宽字符wchar_t而你的字符串字面量是窄字符char。解决在字符串前加L前缀将其变为宽字符字符串例如outtextxy(100, 100, LHello)。或者使用_T()宏它可以根据项目字符集设置自动转换outtextxy(100, 100, _T(Hello))。在项目属性中将“字符集”设置为“使用Unicode字符集”可以一劳永逸但_T()宏是更好的可移植性实践。6.2 运行时与逻辑错误问题3窗口一闪而过看不到任何图形原因控制台程序执行速度很快main函数执行完就退出了。解决在closegraph()之前添加一个等待用户输入的语句。最常用的是_getch()需要#include conio.h。也可以使用Sleep(毫秒数)需要#include windows.h让程序暂停一段时间。对于需要持续运行的图形程序如游戏应该使用一个消息循环或游戏主循环。问题4绘制了图形但被后续操作覆盖或清除了原因绘制顺序错误或者在没有理解“双缓冲”机制的情况下进行了动画绘制。分析EasyX默认使用双缓冲。这意味着你的所有绘图操作如circle,line并不是直接画在显示给用户看的窗口上前缓冲而是画在一个后台的、不可见的缓冲区后缓冲里。只有当你在一次绘图操作后或者手动调用FlushBatchDraw()、EndBatchDraw()时后缓冲的内容才会一次性更新到前缓冲显示出来。解决对于静态画面你通常感觉不到双缓冲的存在。但对于动画错误的绘制顺序会导致闪烁。正确的动画绘制模式是BeginBatchDraw(); // 开始批量绘图 while (true) { // 游戏主循环 cleardevice(); // 清空后台缓冲区 // ... 绘制当前帧的所有图形 ... FlushBatchDraw(); // 将后台缓冲区内容更新到屏幕 Sleep(10); // 控制帧率 } EndBatchDraw(); // 结束批量绘图使用BeginBatchDraw()和EndBatchDraw()包裹你的绘图循环并在每帧末尾调用FlushBatchDraw()可以显著减少画面闪烁。问题5坐标计算错误图形位置不对原因对坐标系和函数参数的理解有误。排查清单原点确认原点(0,0)在窗口左上角Y轴向下为正。矩形参数rectangle(left, top, right, bottom)中的right和bottom坐标是包含的即矩形的右下角像素坐标是(right, bottom)。这与很多其他图形库右下角坐标为(right-1, bottom-1)不同。角度单位EasyX中涉及角度的函数如pie,arc使用的是度数而C标准库数学函数sin,cos,atan2等使用的是弧度。两者混用必然导致错误。牢记转换公式弧度 度数 * π / 180。三角函数方向数学中的角度通常以X轴正方向为0度逆时针旋转为正。而我们在设计界面时常常习惯以12点钟方向为0度顺时针旋转为正如时钟、仪表盘。进行坐标计算时需要进行转换。一个常用技巧是screen_angle 90 - math_angle假设数学角度0度对应屏幕右侧且屏幕Y轴向下。6.3 性能与优化问题问题6动画卡顿帧率很低原因每帧绘制的内容太多或者绘图操作本身效率较低。优化技巧减少不必要的清屏和重绘如果画面只有一小部分在变化可以只重绘变化的区域而不是整个屏幕。使用GetImage和PutImage可以实现局部更新。预计算与缓存对于固定不变的图形如背景、静态UI元素不要每帧都重新绘制。可以在程序开始时将它们画到一个IMAGE对象中每帧只需将这个图像贴到屏幕上这比调用几十个绘图函数快得多。简化图形用多边形代替大量短线段用实心图形代替由多个线条构成的图形。降低分辨率如果卡顿严重可以尝试初始化一个更小的图形窗口。检查循环确保你的游戏主循环没有死循环或阻塞操作。使用Sleep(1)而不是while循环来空转等待。问题7文字显示模糊或有锯齿原因字体尺寸设置不当或者系统字体渲染问题。解决尝试使用不同的字体。一些字体在小尺寸下比另一些更清晰。使用settextstyle设置字体时尽量使用高度能被2整除的数值有时会有更好的效果。EasyX本身对文字抗锯齿的支持有限。如果对文字质量要求高可以考虑先将文字输出到一个临时的IMAGE上然后对这个图像进行缩放或平滑处理再绘制到屏幕但这属于进阶技巧。掌握这些基础问题的解决方法能让你在EasyX的学习路上走得更顺畅。记住遇到问题时首先理清是编译问题、链接问题还是运行时逻辑问题然后根据错误信息或现象对照上述清单进行排查。编程中的调试能力正是在解决一个又一个这样的实际问题中锻炼出来的。
返回列表