同事用#include"xxx.c"把我給驚呆了!
1、聊一聊
? ? 今天分享的是一個(gè)比較生僻的C語言知識(shí)點(diǎn),大家平時(shí)都用過#include"xxx.h"應(yīng)該很少或者幾乎沒有見過.c文件作為頭文件吧,那么今天bug菌就跟大家一起來學(xué)習(xí)一下。
2、操作一波
? ??
? ? 咱們先體驗(yàn)一波#include"xxx.c"文件能不能用:
參考demo:
1//FileName?:main?
2#include?
3#include?
4
5/***************************
6?*?.c文件聲明區(qū)域?
7?**************************/
8#include"module1.c"
9#include"module2.c"
10
11/***************************
12?*?Fuction:?main
13?*?Author?:(公眾號:最后一個(gè)bug)?
14?**************************/
15int?main(int?argc,?char?*argv[])?{
16
17????Fuction1();?
18????Fuction2();?
19????printf("歡迎關(guān)注公眾號:最后一個(gè)bug\n");
20????return?0;
21}
1//FileName:?Module1.c?
2#include
3/***************************
4?*?Fuction:?Fuction1
5?*?Author?:(公眾號:最后一個(gè)bug)?
6?**************************/
7void?Fuction1()
8{
9????printf("Run?Fuction1\n");
10}?
1//FileName:?Module2.c?
2#include
3/***************************
4?*?Fuction:?Fuction2
5?*?Author?:(公眾號:最后一個(gè)bug)?
6?**************************/
7void?Fuction2()
8{
9????printf("Run?Fuction2\n");
10}?
輸出結(jié)果:
分析一下:
? ? 看來這波操作可行,似乎還省去了.h文件,之前bug菌說過,分析.h文件的時(shí)候直接把.h文件在對應(yīng)的.c文件中的位置處展開然后進(jìn)一步分析即可,其實(shí)這.c文件也是如此,接著往下看。
參考demo:
1//FileName?:main?
2#include?
3#include?
4
5char?*?cBug1?=?"bugNo1";??//這里是位置1?
6char?*?cBug2?=?"bugNo2";
7/***************************
8?*?.c文件聲明區(qū)域?
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?:(公眾號:最后一個(gè)bug)?
19?**************************/
20int?main(int?argc,?char?*argv[])?{
21
22????Fuction1();?
23????Fuction2();?
24????printf("歡迎關(guān)注公眾號:最后一個(gè)bug\n");
25????return?0;
26}
1//FileName:?Module2.c?
2#include
3/***************************
4?*?Fuction:?Fuction1
5?*?Author?:(公眾號:最后一個(gè)bug)?
6?**************************/
7void?Fuction1()
8{
9????printf("Run?Fuction1\n");
10????printf("%s\n",cBug1);
11}?
1//FileName:?Module2.c?
2#include
3/***************************
4?*?Fuction:?Fuction2
5?*?Author?:(公眾號:最后一個(gè)bug)?
6?**************************/
7void?Fuction2()
8{
9????printf("Run?Fuction2\n");
10????printf("%s\n",cBug2);
11}?
輸出結(jié)果:
分析一下:
? ? 我們在位置1進(jìn)行兩個(gè)變量的定義,成功編譯運(yùn)行得到如上的結(jié)果,符合我們的預(yù)期,然而當(dāng)我們?nèi)サ粑恢?進(jìn)行位置2的定義,程序卻無法進(jìn)行編譯,看來跟我們預(yù)期在編譯過程中直接展開.c文件是一致的。
3、有什么用?
? ??
? ? 這種方式在bug菌的編碼歷史長河中一般只在兩種情況下用到:
? ? 有些歷史悠久的項(xiàng)目經(jīng)過了N多位大佬的蹂躪,說實(shí)在的代碼結(jié)構(gòu)上已經(jīng)非常可怕了,往往每個(gè)源文件內(nèi)容非常之長,為了保持代碼原樣,會(huì)采用#include"xxx.c"把這幾的相關(guān)文件嵌入進(jìn)去,也便于自己后期維護(hù)。
? ? 在前期進(jìn)行軟件調(diào)試的時(shí)候可能自己會(huì)在不同的文件中安插不同測試功能函數(shù),通過這樣方法可以方便的引入和剔除。
? ? 比如說你需要對源文件中的一些靜態(tài)變量進(jìn)行相關(guān)的監(jiān)控處理,然而又不想在本文件中增加測試代碼,于是便可以在#include"xxx.c"中進(jìn)行測試函數(shù)的編寫來供使用,比如 :
1//FileName?:main?
2#include?
3#include?
4
5static?int?a?=?5;?
6/***************************
7?*?.c文件聲明區(qū)域?
8?**************************/
9#include"module1.c"
10
11/***************************
12?*?Fuction:?main
13?*?Author?:(公眾號:最后一個(gè)bug)?
14?**************************/
15int?main(int?argc,?char?*argv[])?{
16
17????Fuction1();?
18????printf("main?%d\n",a);
19????printf("歡迎關(guān)注公眾號:最后一個(gè)bug\n");
20????return?0;
21}
1//FileName:?Module2.c?
2#include
3/***************************
4?*?Fuction:?Fuction1
5?*?Author?:(公眾號:最后一個(gè)bug)?
6?**************************/
7void?Fuction1()
8{
9????printf("Run?Fuction1\n");
10????printf("Fuction1?%d\n",a);
11}?
? ? 那么之前有小伙伴說 : " static的作用域僅僅在對應(yīng)的文件中 ",通過上面的多個(gè).c文件使用靜態(tài)a變量,那么這位小伙伴表述就不那么貼切了!
4、最后總結(jié)
? ??
? ? 大家在正常的開發(fā)過程中bug菌還是不建議使用#include"xxx.c",因?yàn)樵谖覀兂绦虻脑O(shè)計(jì)過程中,.h文件就是一種外部的引用接口,而.c是對應(yīng)的內(nèi)部實(shí)現(xiàn),如果濫用#include"xxx.c"有可能造成函數(shù)等等的重復(fù)定義,同時(shí)也對調(diào)試相關(guān)程序帶來一些困擾,當(dāng)然如果游刃有余就沒啥問題的啦。
???不過對于喜歡寫長文件的小伙伴來說卻是是福音,把一個(gè)長的.c文件分成多個(gè).c文件,這樣至少可以把不知道這種用法的同事面前秀一秀!
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請聯(lián)系我們,謝謝!