最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言詳細(xì)分析講解多文件的程序設(shè)計(jì)

 更新時(shí)間:2022年04月21日 10:14:27   作者:清風(fēng)自在?流水潺潺  
所謂的C語言多文件編程就是,將代碼實(shí)現(xiàn)模塊化。比如說一個(gè)項(xiàng)目的一項(xiàng)功能放在一個(gè)一個(gè)文件里,然后將實(shí)現(xiàn)這個(gè)功能的函數(shù)放在一個(gè)c文件<BR>

一、多文件與編譯器鏈接

如下圖所示,.o 為目標(biāo)文件,鏈接器將不同的目標(biāo)文件裝配組合在一起形成一個(gè)可執(zhí)行文件。

二、多文件之間的相互訪問

每個(gè)文件可以定義功能接口(可被其它文件訪問的函數(shù)或數(shù)據(jù))

  • 源文件:代碼實(shí)現(xiàn)文件,后綴為.c
  • 頭文件:源文件的接口定義文件,后綴為.h

當(dāng)需要使用其它文件提供的功能時(shí),包含對(duì)應(yīng)的頭文件

語法:

#include <hearer.h>

#include "header.h"

三、關(guān)于#include

#include 用于聲明使用其它文件的功能(頭文件可看作工具包)

#include <...>

在編譯系統(tǒng)文件中查找頭文件

#include "..."

先查找當(dāng)前工程文件夾,再查找編譯統(tǒng)文件夾

四、頭文件使用的一些原則

  • 頭文件中只做函數(shù)聲明和變量聲明(不做具體定義)
  • 頭文件中可定義數(shù)據(jù)類型(typedef, struct, union, enum)
  • 根據(jù)具體實(shí)現(xiàn),一個(gè)頭文件可對(duì)應(yīng)多個(gè)源文件(多數(shù)情況一對(duì)一)
  • 不要使用#include語句包含源文件

五、再論全局變量

普通全局變量

  • 源文件中定義的全局變量可在所有其它源文件中使用
  • 可使用 extern 關(guān)鍵字在頭文件中進(jìn)行聲明,并在其它文件使用

靜態(tài)全局變量

  • static 修飾的全局變量只能在當(dāng)前源文件中使用
  • 無法通過 extern 關(guān)鍵字聲明,在其它文件使用

六、注意事項(xiàng)

函數(shù)聲明語句默認(rèn)自帶 extern 關(guān)鍵字修飾

類型定義必須在頭文件中,僅類型聲明無法創(chuàng)建變量

靜態(tài)全局變量

  • 生命期為程序運(yùn)行期
  • 作用域僅在定義的文件中
  • 無法直接在其它文件中使用

static 關(guān)鍵字可使函數(shù)具備文件作用域(靜態(tài)函數(shù))

靜態(tài)函數(shù)無法在其它文件中被調(diào)用

函數(shù)設(shè)計(jì)時(shí)需要考慮是否在其它文件中使用

七、實(shí)驗(yàn)程序

以CodeBlcoks為例,先建好 main.c 文件之后,點(diǎn)擊File,New,再點(diǎn)擊File,選擇 Empty file,分別建一個(gè) .h 和 .c 文件,完成多文件創(chuàng)建。

opm.h 代碼:

struct Test
{
    int a;
    int b;
};
extern int g_var;   // 聲明全局變量時(shí),不需要給出初始值
extern int f_var;
int add(int a, int b);
int mul(int, int);   // 進(jìn)行函數(shù)聲明的時(shí)候,可以省略參數(shù)名
extern void test();

opm.c 代碼:

#include <stdio.h>
int g_var = 1;
static int f_var = 2;   // 只能在當(dāng)前文件中使用 ==> 靜態(tài)全局變量
static void func()  // 靜態(tài)函數(shù)只能在當(dāng)前文件中被調(diào)用
{
    printf("void func() : f_var = %d\n", f_var);
}
void test()   // 當(dāng)前文件中定義的所有函數(shù)都可以調(diào)用 func() 函數(shù)
{
    func();
}
int add(int a, int b)
{
    return a + b;
}
int mul(int a, int b)
{
    return a * b;
}

main.c 代碼:

#include <stdio.h>
#include <string.h>
#include "opm.h"
int main()
{
    struct Test t = {1, 2};
    printf("a + b = %d\n", add(t.a, t.b));
    printf("a * b = %d\n", mul(t.a, t.b));
    printf("g_var = %d\n", g_var);
    // printf("f_var = %d\n", f_var);   // 無法直接使用其他文件中定義的靜態(tài)全局變量
    test();
    return 0;
}

下面為輸出結(jié)果:

通過這個(gè)多文件程序,說明一個(gè)問題:

static 修飾的全局變量和函數(shù)只能在當(dāng)前源文件中使用,所以 func() 函數(shù)不能再 main 函數(shù)中調(diào)用,而 test() 函數(shù)可以在 main 函數(shù)中被調(diào)用。

八、小結(jié)

  • 實(shí)際工程開發(fā)中,多文件程序設(shè)計(jì)是常態(tài)
  • 源文件實(shí)現(xiàn)具體功能,頭文件聲明接口
  • #include 用于聲明需要使用其它文件中定義的功能
  • extern關(guān)鍵字用于函數(shù)和全局變量的聲明
  • static 關(guān)鍵字修飾的全局變量不能在其它文件中使用

到此這篇關(guān)于C語言詳細(xì)分析講解多文件的程序設(shè)計(jì)的文章就介紹到這了,更多相關(guān)C語言 多文件程序設(shè)計(jì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT實(shí)現(xiàn)文件傳輸功能

    QT實(shí)現(xiàn)文件傳輸功能

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)文件傳輸功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ 成員變量的初始化順序問題詳解

    C++ 成員變量的初始化順序問題詳解

    這篇文章主要介紹了C++ 成員變量的初始化順序問題詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 深入解析C++中的auto自動(dòng)類型推導(dǎo)

    深入解析C++中的auto自動(dòng)類型推導(dǎo)

    C++標(biāo)準(zhǔn)委員會(huì)在C++11標(biāo)準(zhǔn)中改變了auto關(guān)鍵字的語義,使它變成一個(gè)類型占位符,允許在定義變量時(shí)不必明確寫出確切的類型,讓編譯器在編譯期間根據(jù)初始值自動(dòng)推導(dǎo)出它的類型,下面我們就來看看auto自動(dòng)類型推導(dǎo)的推導(dǎo)規(guī)則吧
    2024-04-04
  • C語言經(jīng)典順序表真題演練講解

    C語言經(jīng)典順序表真題演練講解

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示
    2022-04-04
  • C++ pair方法與vector方法案例詳解

    C++ pair方法與vector方法案例詳解

    這篇文章主要介紹了C++ pair方法與vector方法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 淺談c++中的stl中的map用法詳解

    淺談c++中的stl中的map用法詳解

    下面小編就為大家?guī)硪黄獪\談c++中的stl中的map用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    這篇文章主要為大家詳細(xì)介紹了在圖片不被裁剪時(shí),opencv如何實(shí)現(xiàn)繞圖片中任意點(diǎn)旋轉(zhuǎn)任意角度,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-09-09
  • 基于結(jié)構(gòu)體與指針的詳解

    基于結(jié)構(gòu)體與指針的詳解

    本篇文章是對(duì)結(jié)構(gòu)體與指針進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt 使用Poppler實(shí)現(xiàn)pdf閱讀器的示例代碼

    Qt 使用Poppler實(shí)現(xiàn)pdf閱讀器的示例代碼

    下面小編就為大家分享一篇Qt 使用Poppler實(shí)現(xiàn)pdf閱讀器的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 老生常談C++getline使用方法

    老生常談C++getline使用方法

    下面小編就為大家?guī)硪黄仙U凜++getline使用方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06

最新評(píng)論

大荔县| 武威市| 呼和浩特市| 泌阳县| 博客| 开封县| 杨浦区| 吉林市| 高雄市| 曲周县| 镇雄县| 潮安县| 永昌县| 阜阳市| 忻州市| 洛阳市| 沧源| 九龙县| 英吉沙县| 黔江区| 大悟县| 都昌县| 双桥区| 镇远县| 航空| 卢氏县| 分宜县| 原阳县| 郑州市| 浮梁县| 岱山县| 苗栗市| 玛曲县| 周至县| 电白县| 广水市| 汉中市| 岐山县| 手机| 剑河县| 龙海市|