前言:看过小编前段时间上传的那份有关C51程序书写,介绍#include指令两种写法的区别和使用typedef声明新类型名等方面知识的文档,可能会对#include指令的两种写法不是很明白。比如,什么时候适合用“#include<>”,什么时候又适合用“#include\"\"”。本次小编将通过介绍如何在keil软件里面进行模块化编程来详细说明。
为什么要进行模块化编程:
一般而言,一个小程序只包含一个源程序文件,在这个源程序文件中又包含若干个函数(其中有一个是main函数)。刚开始写程序,很多读者在keil里面编程,几乎都是一个程序一个源程序文件(小编刚开始写程序也是一样滴
)。
当然,刚开始写的程序都是些小程序,所以进行模块化编程也没这个必要。不过随着编程者知识的积累,当尝试着去写大程序时就会发现,当程序规模较大时,所包含的函数的数量较多,如果把所有的函数都放在同一个源程序文件中,则此文件显得太大,不便于编译和调试。而且有时连自己都会被弄得稀里糊涂的,那就更不用说把程序拿个别人看了。所以为了便于调试和管理,可以使一个程序包含若干个源程序文件,每个源程序文件又包含若干个函数。(一个源程序文件就是一个程序模块,即将一个程序分成若干个程序模块。)
接下来小编将通过介绍“数码管模拟时钟”这个程序来给大家详细的介绍三种模块化编程方法:
(提示:此次小编介绍的这三种模块化编程方法相互之间是存在着一定的联系的,所以读者最好按照从前及后的顺序浏览,免得看到后面的内容时会很模糊。另外,虽然文章篇幅很长,但信息量不多,需要注意的知识点可能“藏在了”某些不起眼的地方。这点小编今后会逐渐完善。此外,keil版本为UV4,与UV5的不同文中会具体细节具体说明。)
方法一:一个“.c”文件对应一个“.h”文件。
步骤一:(建立源程序文件)
新建一个工程后,我们新建一个源程序文件,保存时我们不能像往常那样直接保存在之前建的那个文件夹里面,而是在之前建的那个文件夹里再建一个文件夹。新建的这个文件夹是用来专门放“.c”“.h”文件的,所以我们就给它命名为“ch”(或其它合法文件名)。如下图
1
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。
图1
然后进入刚新建的这个“ch”文件夹,把要保存的“.c”或者“.h”文件保存在这里面。如下图
图2
刚我们保存的是一个“.c”文件,然后我们按照“数码管模拟时钟”需要的几大模块(主函数、初始化函数、显示函数)再新建几个源程序文件,按照刚才的方法依次保存在“ch”文件夹里面。下图中小编又新建和保存了两个“.c”源程序文件,及其对应的“.h”文件。如下图
2
模块化编程
图3
图4
其中“.h”文件与“.c”新建和保存方法一样,唯一不同就是把“.c”中的“c”改为“h”。这样我们就完成了第一步,接下来我们就开始第二步。(打字好累啊,还有那么多
)
步骤二:(对各类工程目录文件进行分类——UV5自动设置生成故不需要此步)
首先,点击工具栏类似于一个魔法棒的按钮。如下图
3
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。
图5
以前我们写程序都是在检查程序没错误后,才点击此按钮,把生成hex文件选项勾上。这里我们可以“顺便”提前把这个选项勾上,就可以避免写完程序后总是忘勾此选项了。之所以称为顺便,是因为我们点击这个按钮的主要目的不是为了去勾上hex文件生成选项,而是为了在编译的时候让各类工程目录文件进行自动分类。比如,输出类文件归类在一个文件夹里,清单类文件归类在一个文件夹里。具体操作如下:
点击进入后,我们点击对话框里面“output”这个按钮。然后勾上hex文件生成选项。如下图
图6
【说明:以下两步在UV5版本不需要手动操作,软件会自动设置并生成分类文件。如图13】
4
模块化编程 然后我们点击“Select Folder for Objects”按钮。如下图
图7
出现一个对话框(图8)。我们点击新建文件按钮(或者在空白处单击右键新建一个文件夹),就在此对话框里新建了一个文件夹。由于我们开始点击的是“Output”,我么就给此文件夹命名为“Output”(或其他合法文件名)。重命名后一定要记得进入这个文件夹,单击“OK”自动退出才行(图9),否则工程目录文件中的输出类文件(这里就指出了,此文件夹是用来装输出类文件,比如说hex文件)在编译时是不会被自动分类到里面的。
图8
5
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。
图9
然后我们点击“Output”右边的“Listing”按钮,进入后点击“Select Folder for Listing”按钮。如下图
图10
接下来的操作和前面一样。只是要把新建的文件夹命名为“List”(或其他合法文件名),然后点进此文件夹,再单击“OK”按钮自动退出(此文件夹的作用就是将工程目录文件中的清单类文件归类到此文件夹里)。如下图
6
模块化编程
图11
以上操作做完后,此时我们一定要记得点击剩余窗口的“OK”按钮,否则我们之前勾的生成hex文件选项仍没被勾选上。如下图
图12
这样我们就完成了两步了。
然而,在keil的UV5版本,以上关于文件分类的操作步骤,keil软件是会自动设置完成的,所以不需要人为的手动操作。生成的两个文件夹名分别为“Listings”和“Objects”(如图13),眼尖的读者应该会注意到这两个单词在哪里出现过——也即就在前面的两步操作中,我们分别点击“Output”和“Listing”按钮后,再点击“Select Folder for Objects”和“Select Folder for Listing”按钮,看到这应该就知道那两个文件夹的文件名的来由咯。从此可见,keil软件升级后的变化其实不大,但至于升不升级,各有利弊,由读者们自行斟酌。
7
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。 官方网站:http://www.keil.com/
图13
接下来我们就开始第三步
。
步骤三:(给整个工程进行重命名操作)
首先,我们点击工具栏中有个用三种不同颜色的正方形叠加起来的按钮(就在上一步点击的那个类似魔法棒的按钮的右边)。如下图
图14
8
模块化编程 点击后弹出一个对话框,里面的排布有以下这些对应关系。如下图
图15
其实第一栏就是整个工程的工程名(系统默认为Target 1),我们可以对它进行重命名(双击即可)。这里小编就给它重命名为“数码管模拟时钟”。在第一步中,我们建立了三个“.c”源程序文件,也即三个程序模块,而上图中的第二栏就相当于是此工程所包含的各个模块的名称。而第二栏中只有一个默认文件怎么办?其实很简单,我们用鼠标左键双击它下面的空白处即可(或者点击新建文件夹按钮)。如果我们建多了或者不想要某个了,而怎么去删除呢?我们只需要用鼠标左键单击一下要删除的文件名,然后点击删除按钮即可。如下图
图16
右边的那两个黑色箭头的功能是返回上一步操作和下一步操作。如果我们想按照自己的意愿来排布这几个文件,我们就用鼠标左键长时间单击住需要移动的文件,这样我们就可以移动该文件到我们想排布在哪的位置。
9
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。 第一栏和第二栏我们现在都知道代表的是什么,而且知道了怎么去操作。但第三栏代表的是什么呢?其实第三栏才是最重要的。以前我们添加“.c”文件都是在窗口的左侧,用鼠标右键单击后选择添加。这里小编给大家介绍另一种添加“.c”文件的方法。既然放在这里说,当然与第三栏是有关联的。的确,在这里我们想要给第二栏的哪个程序模块里添加“.c”文件,我们只需用鼠标左键单击下该模块(蓝色光标覆盖上),然后点击第三栏的“Add Files”按钮,这时会弹出一个窗口。在第一步的时候我们把“.c”文件都是保存在“ch”文件夹里的,所以这里我们就打开“ch”文件夹,然后把对应的“.c”文件添加即可。如下图
图17
图18
10
模块化编程
图19
然后按照这个操作把其它两个程序模块对应的“.c”文件添加到各模块中。添加完各模块的“.c”文件后,同样的一定记住点击“OK”按钮(如下图),否则刚添加的“.c”文件也是没被添加到各模块的。
图20
经过以上操作,我们就做完了一个程序模块对应一个“.c”文件的准备工作,得到了下图中的效果。(看了是不是觉得一目了然
)
11
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。
图21
如果你嫌这样太麻烦,不想一个程序模块对应一个文件。那么小编在这里再向大家介绍一种“简便”方法——我们在第二栏不像之前那样一个程序模块对应一个文件,而就一个文件,小编给它重命名为“Source Group”(或其它合法文件名),然后将所有的“.c”文件都添加到这个文件里面。如下图
图22
12
模块化编程
图23
至于今后编程时大家选哪种格式,这里没有硬性要求,读者可以结合自己的编程风格进行选择。(后面的例程小编均是以第一种格式,其它风格请自行补脑哟)。接下来我们就开始具体介绍如何模块化编程了。
步骤四:(如何模块化编程)
首先,我们将自建的头文件的基本框架搭起。如下图
图24
13
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。
图25
其中“#ifndef”和“#define”所在两行后面的字符串编程者是可以随便定义的,但必须保证是合法的C语言标识符,以及不能与其它文件重复。不过小编还是建议大家都写相应头文件的名称,比如说初始化函数的头文件名是“init.h”,所以我们就写“INIT_H”,显示函数类似就写“DISPLAY_H”。因为这样就可以避免有多个头文件时出现重复定义而出错。
对于“#ifndef……#define……#endif”这个结构具体有什么作用,小编结合网友的说法以及小编自己查找到的资料来解释说明:
C语言专门定义了两个预处理语句#ifdef与#ifndef,它们用来测试某个名字是否已经定义。故以上结构的大概意思就是说:如果没有定义(宏定义)一个字符串,我们就定义它,然后执行该条件语句中的内容;如果定义过了就跳过不执行任何内容。其目的也就是为了保证该头文件的内容只被包含一次(条件包含)。比如第一次包含头文件init.h时,将定义名字INIT_H;此后再次包含该头文件时,会发现该名字已经定义,这样将直接跳转到#endif处。更形象的解释如下:
比如在keyscan()函数中我们调用了delay()函数,然后在main()函数中我们也调用了delay()函数。那么,在keyscan()函数中就要包含头文件“delay.h”,然后在main()函数中也要包含“delay.h”。若主函数中我们调用过keyscan(),那么在编译时,遇到delay()和keyscan()就会对“delay.h”进行两次解释,因此就会出现错误。若有以上预处理指令的话,在第二次的时候这个DELAY_H就已经被定义过了,所以就不会出现重复定义的问题。这就是它的作用。(有兴趣的读者也可以去查找相关资料加深自己的理解。)
但是,“#ifndef……#define……#endif”结构并不是强制必须要包含在头文件里,可以不写。不过根据以上对此结构的解释说明,从一个程序的可移植性出发,小编建议大家此结构还是要有。
其实究竟该如何进行模块化编程,最直接的方法是以视频的形式介绍。可刚开始的时候没想到这种方法(小编真的out了
……),小编也就只好继续通过
打字来介绍。如果有哪里介绍得不清楚,可以通过各种联系方式与小编交流。考
14
模块化编程 虑到工作量,下面小编先将各模块的程序代码先展示如下(数码管、LED的锁存语句顺序待完善,但程序只是方便大家更好的理解): 主函数模块:
#include< reg52.h> #include\"init.h\" #include\"display.h\"
Uchar tt;
int main(void) /***主函数***/ {
Uchar hour=23; Uchar minute=59; Uchar second=50; //刚上电时时间是“23:59:50”(值可以改变)
init(); //调用初始化子函数 init_timer1(); while(1) { if(tt==20) //1s到了 { tt=0; //清零 second++; if(second==60) //如果秒计满60,将秒计数变量清0 { second=0; minute++; if(minute==60) //如果分钟计满60,将分钟计数变量清0 { minute=0; hour++; if(hour==24) //如果小时计满24,将小时计数变量清0 { hour=0; } } } } display(hour,minute,second);//调用数码管显示函数 }
return 0; }
void timer1(void) interrupt 3 /***T1中断服务程序***/
15
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。 {
TH1=(65536-50000)/256; TL1=(65536-50000)%256; tt++; }
初始化模块:
//T1重新装入数值
#include< reg52.h> #include\"init.h\"
void init(void) /***主函数初始化子函数***/ {
led=1;
P0=0xff; //关闭LED led=0;
dz=1;
P0=0x00; //关闭点阵 dz=0; }
void init_timer1(void) /***定时器初始化函数***/ {
TMOD=0x10; //T1工作方式为方式1——16位定时计数器 TH1=(65536-50000)/256; //装入初值 TL1=(65536-50000)%256; //50000us EA=1; //开总中断 ET1=1; //开T1中断 TR1=1; //允许T1运行 }
显示模块:
#include< reg52.h> #include\"display.h\"
Uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66, //共阴 0x6d,0x7d,0x07,0x7f,0x6f}; //0~9 void delay(Uint t) /***延时函数***/ {
Uchar j; for(;t>0;t--) for(j=110;j>0;j--); }
16
模块化编程 void display_second(Uchar s) {
wela=1;
P0=0x7f; wela=0; dula=1;
P0=duma[s%10]; dula=0;
P0=0xff; delay(13); 合写的延时程序而定!)
wela=1; P0=0xbf; wela=0; dula=1;
P0=duma[s/10]; dula=0;
P0=0xff; delay(13); 合写的延时程序而定!)
wela=1; P0=0xdf; wela=0; dula=1;
P0=0x40; dula=0;
P0=0xff; delay(10); 合写的延时程序而定!) }
void display_minute(Uchar m) {
wela=1;
P0=0xef; wela=0; dula=1;
P0=duma[m%10]; dula=0;
P0=0xff; delay(13); 合写的延时程序而定!)
/*秒*/
//秒个位
//消重影
//延时太长会闪烁,延时太短会不亮(具体延时结
//秒十位
//消重影
//延时太长会闪烁,延时太短会不亮(具体延时结
//分隔符'-'
//消重影
//延时太长会闪烁,延时太短会不亮(具体延时结
/*分*/
//分个位
//消重影
//延时太长会闪烁,延时太短会不亮(具体延时结
17
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。
wela=1; P0=0xf7; wela=0; dula=1;
P0=duma[m/10]; dula=0;
P0=0xff; delay(13);
合写的延时程序而定!)
wela=1; P0=0xfb; wela=0; dula=1;
P0=0x40; dula=0;
P0=0xff; delay(10);
合写的延时程序而定!) }
void display_hour(Uchar h) {
wela=1;
P0=0xfd; wela=0; dula=1;
P0=duma[h%10]; dula=0;
P0=0xff; delay(13);
合写的延时程序而定!)
wela=1; P0=0xfe; wela=0; dula=1;
P0=duma[h/10]; dula=0;
P0=0xff; delay(13);
合写的延时程序而定!) }
//分十位
//消重影
//延时太长会闪烁,延时太短会不亮(具体延时结
//分隔符'-'
//消重影
//延时太长会闪烁,延时太短会不亮(具体延时结
/*时*/
//时个位
//消重影
//延时太长会闪烁,延时太短会不亮(具体延时结
//时十位
//消重影
//延时太长会闪烁,延时太短会不亮(具体延时结
18
模块化编程
void display(Uchar hr,Uchar min,Uchar sec) {
display_second(sec); display_minute(min); display_hour(hr); }
/***数码管显示函数***/
接下来的问题就是如何将三个“.c”文件关联起来?
平常我们在一个源程序文件中,我们是用#include指令将库函数里面的头文件与我们的程序关联起来。同理,我们也可以将我们自建的头文件用#include指令与我们的程序关联起来(如以上代码)。细心的读者可能会发现小编给的程序代码中,头文件就有两种写法“#include<>”和“#include\"\"”,而且库函数里的头文件是用的#include<>形式,而自建的头文件是用的#include\"\"形式。究竟什么情况该用哪种形式,以及为什么要用那种形式,如果看过小编上传的前一份文档,就会很清楚了。这里小编就不再作介绍了的操作了。如下图
。然后就是对头文件内部
图26
很明显,其中第一个红框代表的是对C5X系列单片机寄存器的定义。其实,寄存器的定义也可以在该模块的“.c”文件里面进行,不过考虑到某些时候其它程序模块也可能会用到该端口,小编还是建议大家将寄存器定义在各程序模块的头文件中(提示:现在许多芯片自带的头文件中已经将所有的IO口进行定义声明,故可直接在程序使用)。然后就是第二个红框,它代表的是对那些需要在其它程序模块里面进行调用的函数进行一个“声明”。这里小编用的是C语言关键字“extern”,其作用就是将函数声明为外部调用函数。形式如下:
[extern] 函数类型 函数名(函数参数表);
19
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。 注:定义外部调用函数时,前面的extern可以不写,C语言中默认都是此类型(写了
也只是画蛇添足呢)——详见各类C教程有关内部函数和外部函数的相关章节。 但后面的“;”一定不能遗漏!!!
通过这个操作,只要我们把这个头文件用#include指令关联在某个源程序文件里面,我们就可以在该源程序文件里面调用它。如下图
图27
而对于显示模块的操作方法与以上对初始化模块的操作一样。但唯一不同的是,显示模块多了如下红框里面typedef名称。如下图
图28
关于typedef名称该放在哪里,这里一两句话说不清楚,待小编介绍下一种方法时小编会详细说明的。现在大家只要记住:如果头文件里面用到新定义的类型名时,该头文件里面就必须要有typedef名称(这句话对与不对,对于前面提到的
20
模块化编程 条件包含若使用得当,这里就不深究了)。另外还需注意的一点是,每个头
文件必须在它所对应的“.c”源程序文件里面用#include指令关联。如下图
图29
图30
本种方法小编暂时介绍到此,如果有不懂的可与小编联系(联系方式将备注在末尾
)。
方法二:一个“.c”文件对应一个“.h”文件。(头文件汇总)
此种方法与方法一类似,唯一的不同就是此方法用一个头文件将其它所有的
21
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。 头文件都包含在内。如下图
图31
这里需要注意一点,typedef名称必须要写在包含其定义的新类型名的头文件的前面,否则预编译时会出错。(有兴趣的读者可以尝试将上图两个红框里的内容的顺序更改一下试试具体操作如下:
方法一小编是分的四步介绍,这里小编也将此法分四步介绍。其实每一种模块化编程的流程大致就这四步,而前面三步基本都是一样的操作流程,这里就不再介绍。小编就从第四步开始简单介绍:首先我们在方法一的基础上,再新建一个“.h”文件,这里小编给它命名为“common.h”,其作用就类似于“包含所有”。如下图
)
图32
22
模块化编程
图33
介绍到这里,小编再向大家介绍一种新建“.h”文件(或“.c”文件)的方法:打开工程目录中我们之前创建的“ch”文件夹。如下图
图34
在里面新建一个txt文件,然后重命名为“common.h”(一定要将文件扩展名修改为“.h”)。如下图
23
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。
图35
现在我们需要做的就是在keil软件里面如何打开这个“.h”文件?
其实很简单,我们只需要在任何一个源程序文件里面写句“#include\"common.h\"”,然后鼠标右键单击“common.h”,点击“Open document “common.h””即可。如下图
图36
这样系统就自动显示出“common.h”头文件。如下图
24
模块化编程
图37
这样我们就顺利新建了一个“.h”文件。而“.c”文件用这种方法创建,小编个人认为实在没必要,而为什么没必要?读者则可以慢慢体会。接下来我们还是回到之前的流程上:
然后我们将其它几个头文件名用#include指令关联在里面,也包含52单片机头文件(见图30)。这里其实我们也可以将所有的寄存器都定义在此头文件里面,这样做的好处小编暂时就不指明,等大家今后写的程序多了,就会慢慢明白的。如下图
图38
这里我们将typedef名称定义在此头文件,就解决了方法一中遇到的问题。因为我们这里将typedef名称定义在所有程序模块的头文件前面,所以就不用担心遗漏或者重复而出现预编译错误。
25
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。 此种写法较第一种写法的优点还在于:在“.c”文件里面,头文件只需要写“#include\"common.h\"”一个就可以了,因为它自身就包含了其它的头文件。如下图
图39
图40
26
模块化编程
图41
方法三:一个“.h”文件,若干个“.c”文件。
其实小编刚开始用模块化编程时,第一种方法和第二种方法都写过。但随着对模块化编程的熟悉,以及写的程序规模越来越大,小编发现第一种方法有时候很麻烦。而且有些时候,头文件里面就只需声明一个外部调用函数(图42)。难道我们就为了去声明这一个函数而专门为它建一个头文件
?
图42
而且当建的源程序文件很多时,所有的文件在keil软件窗口的中间那栏无法同时显示。如下图
27
复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。
图43
其实还有几个文件没能够显示在那栏。
遇到这种情况,如果我们考虑只建一个“.h”文件呢,这样是不是就减少了许多工作量?至于具体怎么操作,下面小编将为大家慢慢道来。
还是同样的话,前面三步所有的模块化编程基本都差不多,小编在这里也不再介绍,小编还是直接从第四步开始给大家继续介绍:
首先,将我们前两步建的“.h”文件都删完(怎么删除这里小编只简单提示一下:新建一个文件,在保存的时候……或者在工程文件目录里……),重新建一个“.h”文件,命名为“common.h”。这里小编就木有写“#ifndef……#define……#endif”这个结构,而直接将typedef名称、以及所有的寄存器都定义在此头文件内,小编自我检讨。如下图
图44
这里小编也把“#include 28 模块化编程 了在“.c”源程序文件里面少写一个头文件(偶尔懒惰一下还是可以滴)。接 下来我们就把每个程序模块里面需要在其它模块里面调用的函数进行外部调用函数声明。声明方法在方法一中已经详细介绍,这里小编就不再作介绍。如下图 图45 同样,我们在“.c”文件里面只需要添加一个“#include\"common.h\"”头文件即可(见图39、图40、图41)。 最后,小编给大家还简单介绍一点知识——供外部调用的全局变量和全局数组。某些时候,我们可能会在多个源程序文件里面共用某个全局变量(或数组),这时候我们就需要将此变量(或数组)声明为供外部调用类型,声明的方法见图48。其中,我们同样用到了C语言关键字“extern”,但这里的“extern”切记不能省略,否则程序在编译的时候就会出错(读者可在写程序时不写“extern”编译试试)。此外,我们还需在源程序文件里面对该全局变量(或数组)进行初始化,而且必须在函数外进行初始化。如下图 图46 29 复杂的事情要简单做。简单的事情要认真做。认真的事情要重复做。重复的事情要创造性地做。 图47 进行初始化时,对于全局变量我们可以进行赋初值操作,也可以不赋初值(keil编译器默认为0)。而究竟赋不赋初值,以及赋的初值该为多少,则要结合程序而定(如上图)。对于全局数组的初始化,其形式可以如图46所示,也可以类似于“buf[]={0};”和“buf[10];”。 其实,什么时候该将全局变量和全局数组设置为供外部调用的形式,以及究竟该如何初始化是与整个程序的功能存在着特殊的对应关系的,关于这点小编用一两句话也说不清,所以这里也就不作解释。大家今后写程序就会逐渐明白的。 至此,小编本次向大家介绍的三种模块化编程方法基本上算已介绍完毕接下来给大家展示几张小编用方法三写的程序截图。 。 图48 30 模块化编程 图49 结语:本次小编用了近二十个小时给大家介绍了三种在keil里面进行模块化编程的方法(如果是录视频,不知道会节约多少时间历,个人认为方法三比较简便实用(仅个人意见哈 )。不过根据小编的编程经)。至于大家究竟选择哪 种,可以结合自己的编程风格。当然,还有多种模块化编程方法(比如除了主函数,将其它函数模块都写在“.h”文件里面),只是小编的时间和精力确实有限,这里就不再继续介绍,还请大家理解。 此外,希望本次小编的经验分享能够对大家在编程方面有所帮助。如果大家通过浏览小编此次的共享文档,而对自己在编程方面有所借鉴和提高,小编将深感荣幸。若对其中某些内容存在疑惑,或者觉得小编介绍的某些地方存在问题,小编在此诚心欢迎提出。当然,如果您觉得自己有更好的编程方法,小编还希望您能分享一下,小编将不胜感激 。 小编此次经验分享后,可能短时间内不能再向大家以这种形式分享个人经验(今后可能就会是以视频的形式咯 )。不过大家如果有什么问题,欢迎大家 与小编联系。联系邮箱:llingfeng_vip@126.com 初稿:2014年11月 更新:2016年5月 31 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务