[原创] 谈谈如何在keil软件中实现模块化结构编程

caozhaokun   2016-2-3 10:45 楼主
下面的文字是比较粗糙的,我就先粘出几张图片,后期我会完善该帖子,让其有血有肉 有骨架;未完待续... 注意: 当你在一个C文件first.c 中定义了一个变量first_count,但是要在另一个C文件second.c 里调用该变量first_count,这时需要在文件second.c中进行申明。 Example: first.c 中定义: unsigned char flag; second.c中申明:extern unsigned char flag; 注意second.c文件中要加上变量的类型,不然有时会出问题; .h文件里可以放 函数申明,宏定义,其他的都不要放 .c文件里可以放 函数定义 本帖最后由 caozhaokun 于 2016-2-3 13:35 编辑
  • 01.png
  • 02.png
  • 03.png
  • 04.png

回复评论 (10)

2推荐 lcofjp 

引用: caozhaokun 发表于 2016-2-3 13:55
受教了,版主,谢谢的!
我思考了好一会,我目前的知识体系认为:
.h文件在编译器中是首先编译的,也就 ...

我前面已经说了,头文件是不会被编译器单独编译的。头文件只是被嵌入到C文件中,然后对C文件进行编译。
c文件可以被include,但是如果出现交叉引用,那肯定是滥用,至于出不出错完全看c文件的内容是否会产生语法冲突。如果你的c文件按着h文件的标准写,那肯定是没有问题的,但是这不符合常规逻辑。所以尽量区分h文件和c文件的意义,按常规规则出牌。
点赞  2016-2-3 15:21
原则上不要在头文件中定义变量,如果此头文件被多次引用,就会出问题。
头文件通常对函数和变量进行声明与数据类型的定义、宏定义。
点赞  2016-2-3 11:06
引用: lcofjp 发表于 2016-2-3 11:06
原则上不要在头文件中定义变量,如果此头文件被多次引用,就会出问题。
头文件通常对函数和变量进行声明与 ...

我想问一下:如果头文件里 定义了变量,多次引用后有哪些后果的?
定义的变量是可以作为该文件夹里所有文件的全局变量的
点赞  2016-2-3 11:17
引用: caozhaokun 发表于 2016-2-3 11:17
我想问一下:如果头文件里 定义了变量,多次引用后有哪些后果的?
定义的变量是可以作为该文件夹里所有 ...

被include的文件(通常是头文件,也可以是c文件),会被展开到include语句的位置。
通常头文件就是被include的,因为通常编译器不会编译.h文件。
如果include语句不是放在函数内部的话,那么头文件的内容会具有全局作用域。
全局作用域在所有c文件中都是可见的(指的仅是非static的函数和变量)
如果此文件定义变量并且被多次引用,那么就会出现多个c文件拥有相同名称的变量或者函数定义,c中是不允许变量和函数重名的,所以就会导致编译错误。所以,通常不在头文件中定义函数(内联函数除外,内联函数不会产生函数调用,而是直接展开,与宏定义有点类似)和变量,但如果你能保证只被include一次,那也并没有什么大问题。
点赞  2016-2-3 11:34
感觉你还是先搞懂下面的概念:
声明、定义、赋值、赋初值、初始化。
点赞  2016-2-3 12:12
引用: lcofjp 发表于 2016-2-3 11:34
被include的文件(通常是头文件,也可以是c文件),会被展开到include语句的位置。
通常头文件就是被inc ...

受教了,版主,谢谢的!
我思考了好一会,我目前的知识体系认为:
.h文件在编译器中是首先编译的,也就是在程序运行之前就已经编译,有些像 宏定义
还请指正一二;
还有两个问题:
1:在一个.c文件中,include+include多个.c,【当多个.c文件交叉引用时,是否才会出现编译出错?】
2:在一个.c文件中,include+include多个.h,【此等情况下是不会出现编译出错】
非常感谢你花时间解答,
点赞  2016-2-3 13:55
如果要进行模块化编程,建议:
1. 把每个c文件作为一个模块,相关部分放在同一个c文件中,模块的接口放在头文件中。
2. 既然模块化,就要避免全局变量的使用,通过接口(函数)来通信。当然全局变量的效率可能更高一些,但是全局变量不宜过多。
3. 模块内的私有成员(变量和函数)应该声明为static,这样不同模块间同名变量和函数不会产生冲突。
点赞  2016-2-3 15:25
引用: lcofjp 发表于 2016-2-3 15:25
如果要进行模块化编程,建议:
1. 把每个c文件作为一个模块,相关部分放在同一个c文件中,模块的接口放在 ...

lcofjp,非常谢谢你解答了我的几个问题,
你的解答对我帮助很大,也很重要,矫正了我之前的认知;
问题细究之后,才发现理解的不够透彻,我仍需多加努力;
点赞  2016-2-3 15:36
引用: caozhaokun 发表于 2016-2-3 15:36
lcofjp,非常谢谢你解答了我的几个问题,
你的解答对我帮助很大,也很重要,矫正了我之前的认知;
问题 ...

不客气,学习编程是个长期的过程,慢慢来!
点赞  2016-2-3 15:46
板等,做个记号。
点赞  2016-2-4 06:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复