<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          同事用#include"xxx.c"把我給驚呆了??!

          共 3567字,需瀏覽 8分鐘

           ·

          2020-10-07 13:10


          1、聊一聊

          ? ? 歌名雖然是<男孩>卻是一首來自男人內(nèi)心深處的歌,千萬不要在太安靜的環(huán)境中聽,容易傷感!


          ? ? 今天分享的是一個比較生僻的C語言知識點,大家平時都用過#include"xxx.h"應(yīng)該很少或者幾乎沒有見過.c文件作為頭文件吧,那么今天bug菌就跟大家一起來學(xué)習(xí)一下。


          2、操作一波

          ? ??

          ? ? 咱們先體驗一波#include"xxx.c"文件能不能用:


          ?01 體驗一下


          參考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?:(公眾號:最后一個bug)?
          14?**************************/

          15int?main(int?argc,?char?*argv[])?{
          16
          17????Fuction1();?
          18????Fuction2();?
          19????printf("歡迎關(guān)注公眾號:最后一個bug\n");
          20????return?0;
          21}


           1//FileName:?Module1.c?
          2#include
          3/***************************
          4?*?Fuction:?Fuction1
          5?*?Author?:(公眾號:最后一個bug)?
          6?**************************/

          7void?Fuction1()
          8{
          9????printf("Run?Fuction1\n");
          10}?


           1//FileName:?Module2.c?
          2#include
          3/***************************
          4?*?Fuction:?Fuction2
          5?*?Author?:(公眾號:最后一個bug)?
          6?**************************/

          7void?Fuction2()
          8{
          9????printf("Run?Fuction2\n");
          10}?
          輸出結(jié)果:

          分析一下:

          ? ? 看來這波操作可行,似乎還省去了.h文件,之前bug菌說過,分析.h文件的時候直接把.h文件在對應(yīng)的.c文件中的位置處展開然后進一步分析即可,其實這.c文件也是如此,接著往下看。


          ?02 加深理解


          參考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?:(公眾號:最后一個bug)?
          19?**************************/

          20int?main(int?argc,?char?*argv[])?{
          21
          22????Fuction1();?
          23????Fuction2();?
          24????printf("歡迎關(guān)注公眾號:最后一個bug\n");
          25????return?0;
          26}


           1//FileName:?Module2.c?
          2#include
          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
          3/***************************
          4?*?Fuction:?Fuction2
          5?*?Author?:(公眾號:最后一個bug)?
          6?**************************/

          7void?Fuction2()
          8{
          9????printf("Run?Fuction2\n");
          10????printf("%s\n",cBug2);
          11}?
          輸出結(jié)果:

          分析一下:

          ? ? 我們在位置1進行兩個變量的定義,成功編譯運行得到如上的結(jié)果,符合我們的預(yù)期,然而當我們?nèi)サ粑恢?進行位置2的定義,程序卻無法進行編譯,看來跟我們預(yù)期在編譯過程中直接展開.c文件是一致的。


          3、有什么用?

          ? ??

          ? ? 這種方式在bug菌的編碼歷史長河中一般只在兩種情況下用到:


          1、維護毫無設(shè)計的代碼







          ? ? 有些歷史悠久的項目經(jīng)過了N多位大佬的蹂躪,說實在的代碼結(jié)構(gòu)上已經(jīng)非??膳铝?,往往每個源文件內(nèi)容非常之長,為了保持代碼原樣,會采用#include"xxx.c"把這幾的相關(guān)文件嵌入進去,也便于自己后期維護。


          2、測試代碼? ? ? ? ? ? ?



          ? ? 在前期進行軟件調(diào)試的時候可能自己會在不同的文件中安插不同測試功能函數(shù),通過這樣方法可以方便的引入和剔除。


          ? ? 比如說你需要對源文件中的一些靜態(tài)變量進行相關(guān)的監(jiān)控處理,然而又不想在本文件中增加測試代碼,于是便可以在#include"xxx.c"中進行測試函數(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?:(公眾號:最后一個bug)?
          14?**************************/

          15int?main(int?argc,?char?*argv[])?{
          16
          17????Fuction1();?
          18????printf("main?%d\n",a);
          19????printf("歡迎關(guān)注公眾號:最后一個bug\n");
          20????return?0;
          21}


           1//FileName:?Module2.c?
          2#include
          3/***************************
          4?*?Fuction:?Fuction1
          5?*?Author?:(公眾號:最后一個bug)?
          6?**************************/

          7void?Fuction1()
          8{
          9????printf("Run?Fuction1\n");
          10????printf("Fuction1?%d\n",a);
          11}?






          注意了!!



          ? ? 那么之前有小伙伴說 : " static的作用域僅僅在對應(yīng)的文件中 ",通過上面的多個.c文件使用靜態(tài)a變量,那么這位小伙伴表述就不那么貼切了!


          4、最后總結(jié)

          ? ??

          ? ? 大家在正常的開發(fā)過程中bug菌還是不建議使用#include"xxx.c",因為在我們程序的設(shè)計過程中,.h文件就是一種外部的引用接口,而.c是對應(yīng)的內(nèi)部實現(xiàn),如果濫用#include"xxx.c"有可能造成函數(shù)等等的重復(fù)定義,同時也對調(diào)試相關(guān)程序帶來一些困擾,當然如果游刃有余就沒啥問題的啦。


          ???不過對于喜歡寫長文件的小伙伴來說卻是是福音,把一個長的.c文件分成多個.c文件,這樣至少可以把不知道這種用法的同事面前秀一秀!

          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人妻喷水在线 | 字幕一区二区三区四区五区在线看 | 黄色日逼视频 | 亂伦国产一区二区三区 | 国产区99精品 |