同事用#include"xxx.c"把我給驚呆了!!
1、聊一聊
今天分享的是一個比較生僻的C語言知識點,大家平時都用過#include"xxx.h"應該很少或者幾乎沒有見過.c文件作為頭文件吧,那么今天bug菌就跟大家一起來學習一下。
2、操作一波
咱們先體驗一波#include"xxx.c"文件能不能用:
01 體驗一下
參考demo:
- //FileName :main
- #include <stdio.h>
- #include <stdlib.h>
- /***************************
- * .c文件聲明區域
- **************************/
- #include"module1.c"
- #include"module2.c"
- /***************************
- * Fuction: main
- * Author :(公眾號:最后一個bug)
- **************************/
- int main(int argc, char *argv[]) {
- Fuction1();
- Fuction2();
- printf("歡迎關注公眾號:最后一個bug\n");
- return 0;
- }
- //FileName: Module1.c
- #include<stdio.h>
- /***************************
- * Fuction: Fuction1
- * Author :(公眾號:最后一個bug)
- **************************/
- void Fuction1()
- {
- printf("Run Fuction1\n");
- }
- //FileName: Module2.c
- #include<stdio.h>
- /***************************
- * Fuction: Fuction2
- * Author :(公眾號:最后一個bug)
- **************************/
- void Fuction2()
- {
- printf("Run Fuction2\n");
- }
輸出結果:
分析一下:
看來這波操作可行,似乎還省去了.h文件,之前bug菌說過,分析.h文件的時候直接把.h文件在對應的.c文件中的位置處展開然后進一步分析即可,其實這.c文件也是如此,接著往下看。
02 加深理解
參考demo:
- //FileName :main
- #include <stdio.h>
- #include <stdlib.h>
- char * cBug1 = "bugNo1"; //這里是位置1
- char * cBug2 = "bugNo2";
- /***************************
- * .c文件聲明區域
- **************************/
- #include"module1.c"
- #include"module2.c"
- //char * cBug1 = "bugNo1";//這里是位置2
- //char * cBug2 = "bugNo2";
- /***************************
- * Fuction: main
- * Author :(公眾號:最后一個bug)
- **************************/
- int main(int argc, char *argv[]) {
- Fuction1();
- Fuction2();
- printf("歡迎關注公眾號:最后一個bug\n");
- return 0;
- }
- //FileName: Module2.c
- #include<stdio.h>
- /***************************
- * Fuction: Fuction1
- * Author :(公眾號:最后一個bug)
- **************************/
- void Fuction1()
- {
- printf("Run Fuction1\n");
- printf("%s\n",cBug1);
- }
- //FileName: Module2.c
- #include<stdio.h>
- /***************************
- * Fuction: Fuction2
- * Author :(公眾號:最后一個bug)
- **************************/
- void Fuction2()
- {
- printf("Run Fuction2\n");
- printf("%s\n",cBug2);
- }
輸出結果:
分析一下:
我們在位置1進行兩個變量的定義,成功編譯運行得到如上的結果,符合我們的預期,然而當我們去掉位置1進行位置2的定義,程序卻無法進行編譯,看來跟我們預期在編譯過程中直接展開.c文件是一致的。
3、有什么用?
這種方式在bug菌的編碼歷史長河中一般只在兩種情況下用到:
1)維護毫無設計的代碼
有些歷史悠久的項目經過了N多位大佬的蹂躪,說實在的代碼結構上已經非常可怕了,往往每個源文件內容非常之長,為了保持代碼原樣,會采用#include"xxx.c"把這幾的相關文件嵌入進去,也便于自己后期維護。
2)測試代碼
在前期進行軟件調試的時候可能自己會在不同的文件中安插不同測試功能函數,通過這樣方法可以方便的引入和剔除。
比如說你需要對源文件中的一些靜態變量進行相關的監控處理,然而又不想在本文件中增加測試代碼,于是便可以在#include"xxx.c"中進行測試函數的編寫來供使用,比如 :
- //FileName :main
- #include <stdio.h>
- #include <stdlib.h>
- static int a = 5;
- /***************************
- * .c文件聲明區域
- **************************/
- #include"module1.c"
- /***************************
- * Fuction: main
- * Author :(公眾號:最后一個bug)
- **************************/
- int main(int argc, char *argv[]) {
- Fuction1();
- printf("main %d\n",a);
- printf("歡迎關注公眾號:最后一個bug\n");
- return 0;
- }
- //FileName: Module2.c
- #include<stdio.h>
- /***************************
- * Fuction: Fuction1
- * Author :(公眾號:最后一個bug)
- **************************/
- void Fuction1()
- {
- printf("Run Fuction1\n");
- printf("Fuction1 %d\n",a);
- }
注意了!!
那么之前有小伙伴說 : " static的作用域僅僅在對應的文件中 ",通過上面的多個.c文件使用靜態a變量,那么這位小伙伴表述就不那么貼切了!
4、最后總結
大家在正常的開發過程中bug菌還是不建議使用#include"xxx.c",因為在我們程序的設計過程中,.h文件就是一種外部的引用接口,而.c是對應的內部實現,如果濫用#include"xxx.c"有可能造成函數等等的重復定義,同時也對調試相關程序帶來一些困擾,當然如果游刃有余就沒啥問題的啦。
不過對于喜歡寫長文件的小伙伴來說卻是是福音,把一個長的.c文件分成多個.c文件,這樣至少可以把不知道這種用法的同事面前秀一秀!