你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

一个比较生僻的C语言知识点

[复制链接]
gaosmile 发布时间:2020-10-7 21:51
    今天分享的是一个比较生僻的C语言知识点,大家平时都用过#include"xxx.h"应该很少或者几乎没有见过.c文件作为头文件吧,那么今天bug菌就跟大家一起来学习一下。

1、操作一波
   
    咱们先体验一波#include"xxx.c"文件能不能用:


01 体验一下

参考demo:
1//FileName :main
2#include <stdio.h>
3#include <stdlib.h>
4
5/***************************
6 * .c文件声明区域
7 **************************/
8#include"module1.c"
9#include"module2.c"
10
11/***************************
12 * Fuction: main
13 * Author 公众号:最后一个bug)
14 **************************/
15int main(int argc, char *argv[]) {
16
17    Fuction1();
18    Fuction2();
19    printf("欢迎关注公众号:最后一个bug\n");
20    return 0;
21}

1//FileName: Module1.c
2#include<stdio.h>
3/***************************
4 * Fuction: Fuction1
5 * Author 公众号:最后一个bug)
6 **************************/
7void Fuction1()
8{
9    printf("Run Fuction1\n");
10}

1//FileName: Module2.c
2#include<stdio.h>
3/***************************
4 * Fuction: Fuction2
5 * Author 公众号:最后一个bug)
6 **************************/
7void Fuction2()
8{
9    printf("Run Fuction2\n");
10}
输出结果:
微信图片_20201007214846.png
分析一下:
    看来这波操作可行,似乎还省去了.h文件,之前bug菌说过,分析.h文件的时候直接把.h文件在对应的.c文件中的位置处展开然后进一步分析即可,其实这.c文件也是如此,接着往下看。


02 加深理解

参考demo:
1//FileName :main
2#include <stdio.h>
3#include <stdlib.h>
4
5char * cBug1 = "bugNo1";  //这里是位置1
6char * cBug2 = "bugNo2";
7/***************************
8 * .c文件声明区域
9 **************************/
10#include"module1.c"
11#include"module2.c"
12
13//char * cBug1 = "bugNo1";//这里是位置2
14//char * cBug2 = "bugNo2";
15
16/***************************
17 * Fuction: main
18 * Author 公众号:最后一个bug)
19 **************************/
20int main(int argc, char *argv[]) {
21
22    Fuction1();
23    Fuction2();
24    printf("欢迎关注公众号:最后一个bug\n");
25    return 0;
26}

1//FileName: Module2.c
2#include<stdio.h>
3/***************************
4 * Fuction: Fuction1
5 * Author 公众号:最后一个bug)
6 **************************/
7void Fuction1()
8{
9    printf("Run Fuction1\n");
10    printf("%s\n",cBug1);
11}

1//FileName: Module2.c
2#include<stdio.h>
3/***************************
4 * Fuction: Fuction2
5 * Author 公众号:最后一个bug)
6 **************************/
7void Fuction2()
8{
9    printf("Run Fuction2\n");
10    printf("%s\n",cBug2);
11}
输出结果:
微信图片_20201007214851.png
分析一下:
    我们在位置1进行两个变量的定义,成功编译运行得到如上的结果,符合我们的预期,然而当我们去掉位置1进行位置2的定义,程序却无法进行编译,看来跟我们预期在编译过程中直接展开.c文件是一致的。

3、有什么用?
   
    这种方式在bug菌的编码历史长河中一般只在两种情况下用到:

1、维护毫无设计的代码



    有些历史悠久的项目经过了N多位大佬的蹂躏,说实在的代码结构上已经非常可怕了,往往每个源文件内容非常之长,为了保持代码原样,会采用#include"xxx.c"把这几的相关文件嵌入进去,也便于自己后期维护。

2、测试代码            


    在前期进行软件调试的时候可能自己会在不同的文件中安插不同测试功能函数,通过这样方法可以方便的引入和剔除。

    比如说你需要对源文件中的一些静态变量进行相关的监控处理,然而又不想在本文件中增加测试代码,于是便可以在#include"xxx.c"中进行测试函数的编写来供使用,比如 :

1//FileName :main
2#include <stdio.h>
3#include <stdlib.h>
4
5static int a = 5;
6/***************************
7 * .c文件声明区域
8 **************************/
9#include"module1.c"
10
11/***************************
12 * Fuction: main
13 * Author 公众号:最后一个bug)
14 **************************/
15int main(int argc, char *argv[]) {
16
17    Fuction1();
18    printf("main %d\n",a);
19    printf("欢迎关注公众号:最后一个bug\n");
20    return 0;
21}

1//FileName: Module2.c
2#include<stdio.h>
3/***************************
4 * Fuction: Fuction1
5 * Author 公众号:最后一个bug)
6 **************************/
7void Fuction1()
8{
9    printf("Run Fuction1\n");
10    printf("Fuction1 %d\n",a);
11}

微信图片_20201007214855.png


注意了!!


    那么之前有小伙伴说 : " static的作用域仅仅在对应的文件中 ",通过上面的多个.c文件使用静态a变量,那么这位小伙伴表述就不那么贴切了!

4、最后总结
   
    大家在正常的开发过程中bug菌还是不建议使用#include"xxx.c",因为在我们程序的设计过程中,.h文件就是一种外部的引用接口,而.c是对应的内部实现,如果滥用#include"xxx.c"有可能造成函数等等的重复定义,同时也对调试相关程序带来一些困扰,当然如果游刃有余就没啥问题的啦。

   不过对于喜欢写长文件的小伙伴来说却是是福音,把一个长的.c文件分成多个.c文件,这样至少可以把不知道这种用法的同事面前秀一秀!

收藏 评论0 发布时间:2020-10-7 21:51

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版