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

C/C++?extern和static的使用詳解

 更新時(shí)間:2022年06月27日 10:51:19   作者:honky-tonk_man  
這篇文章主要介紹了C/C++?extern和static的使用,在講到extern和static的時(shí)候先了解一下定義和聲明的基本概念,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

前言

在講到extern和static的時(shí)候先了解一下定義和聲明的基本概念

定義(define):

A variable is defined when the compiler allocates the storage for the variable,就是我們的變量個(gè)其存儲(chǔ)的具體值相關(guān)聯(lián)

聲明(declared)

編譯器聲明這個(gè)變量的存在,宣告其類(lèi)型但是并不關(guān)聯(lián)某個(gè)存儲(chǔ)的具體值

你可以聲明一個(gè)變量多次,但是你只能定義其一次并且給一個(gè)范圍,我們定義一個(gè)變量也是聲明,但不是所有的聲明都是定義

extern

我們?cè)谌致暶?定義一個(gè)變量最好的一個(gè)方法是在頭文件中用關(guān)鍵字extern聲明一個(gè)變量
在我們工程中,一般用一個(gè)頭文件聲明全部所需的全局變量(當(dāng)然用extern),然后在所有其他的.c文件中include這個(gè)頭文件,假設(shè)我們有三個(gè)文件分別是file3.h,file1.c,file2.c
內(nèi)容分別如下
var.h

extern int global_var;

var.c

#include "var.h"
#include "prog1.h" //function declarations,我們示例中沒(méi)有將函數(shù)原型頭文件寫(xiě)出來(lái)

int global_var = 33;

int increment(void) { return global_variable++ }

main.c

#include "var.h"
#include "prog1.h"
#include <stdio.h>
//注意我們沒(méi)有include file1.c

void use_it(void){
	printf("global var : %d\n",global_var++);
}

然后我們編譯 (記住不編譯頭文件)

gcc main.c var.c -o out.c

為什么我們的main不include var.c就知道global_var的具體值呢?因?yàn)槲覀冋f(shuō)過(guò)一個(gè)全局變量只能定義一次,但是可以聲明多次,global_var分別在main,c和var.c中聲明了,但是只在var.c中定義,換個(gè)角度,global_var的生命周期是全局也就是整個(gè)軟件的生命周期,整個(gè)軟件的生命周期包含三個(gè)文件,且global_var不定義在堆棧中,而是聲明在bss中,定義在initialed data區(qū)域中

static

static也是全局但是其作用域不是全局而是本文件中,所以其他的文件include一個(gè)含有static的頭文件,且試圖定義他會(huì)報(bào)錯(cuò),因?yàn)閟tatic變量的作用域只在聲明他的頭文件中

還是上述的程序但是我們把extern改為static了
var.h

static int global_var;

var.c

#include "var.h"
#include "prog1.h" //function declarations,我們示例中沒(méi)有將函數(shù)原型頭文件寫(xiě)出來(lái)

int global_var = 33;

int increment(void) { return global_variable++ }

main.c

#include "var.h"
#include "prog1.h"
#include <stdio.h>
//注意我們沒(méi)有include file1.c

void use_it(void){
	printf("global var : %d\n",global_var++);
}

開(kāi)始編譯發(fā)現(xiàn)錯(cuò)誤

c++ static members in class

簡(jiǎn)而言之就是我們的class里面搞一個(gè)static的成員,我們知道static的作用域雖然是全局只存在于本文件,那么將一個(gè)static放在一個(gè)class中間是什么意思呢?
在Cpp的類(lèi)中使用static就不再和C一樣局限于定義的文件中了,在Cpp的class中用static修飾成員有以下的特點(diǎn)

  • 當(dāng)這個(gè)class建立的時(shí)候,此class內(nèi)的static成員在只有一份,無(wú)論創(chuàng)建多少個(gè)class對(duì)象,且每個(gè)對(duì)象都是共享這個(gè)static成員的,換句話(huà)說(shuō)無(wú)論多少個(gè)對(duì)象創(chuàng)建,class的static成員都是第一無(wú)二的,且內(nèi)存中只有一份
  • static成員的初始化發(fā)生在此class所有對(duì)象創(chuàng)建前
  • 他的聲明周期是全程序

我們寫(xiě)一個(gè)程序,寫(xiě)一個(gè)class,在其public中搞一個(gè)static member,且在class的構(gòu)造函數(shù)中對(duì)這個(gè)static member + 1,意味著此static成員作用是統(tǒng)計(jì)有多少個(gè)class對(duì)象成員

static_mamber.h

using namespace std;
class Box{
public:
        static int objcount;
        Box(double l,double b, double h);
        double volume();
private:
        double length;
        double breadth;
        double height;
};

static_member.cpp

#include "static_member.h"
#include <iostream>

using namespace std;


int Box::objcount = 0; //static成員的初始化在創(chuàng)建所有的class對(duì)象之前
//構(gòu)造函數(shù)
Box::Box(double l, double b, double h)
        :length(l),breadth(b),height(h){
                cout << "construct is called," << endl;
                objcount++;
        }

double
Box::volume(){
        return length * breadth * height;
}

main.cpp

#include "static_member.h"
#include <iostream>
using namespace std;
int main(void){
        Box Box1(3.3,1.2,1.5);
        Box Box2(8.5,6.0,2.0);

        cout << "total Box object is "<< Box::objcount << endl;

        return 0;
}

編譯

g++ static_member.cpp main.cpp  -o static_member.o

得到結(jié)果

construct is called,
construct is called,
total Box object is 2

注意class是全局的也就是extern的因?yàn)樵谒衎lock({})外部的變量或者class或者函數(shù)如果不加static都默認(rèn)是extern

總結(jié)

在C語(yǔ)言中extern修飾后的變量或者函數(shù),可以在其他的文件中進(jìn)行使用(需要include定義extern變量或者函數(shù)的頭文件),但是static則不行,static和extern的作用域都是全局但是,static只允許本文件內(nèi)對(duì)其修飾的變量更改,而extern允許在任何文件中更改

在C++中static修飾的是某個(gè)class的一個(gè)成員,和C中的static完全不一樣,首先C++中如果在頭文件中聲明某個(gè)class的某個(gè)成員是static,那么我們?cè)谄渌募?strong>可以定義他(前提include對(duì)于的頭文件),這是在C中是不行的,且C++ static member in clss意思是為此class創(chuàng)建一個(gè)獨(dú)一無(wú)二的成員,不論你的class實(shí)例化多少次,static成員就一個(gè),其他的class對(duì)象都是其copy,并且我們可以隨時(shí)隨地修改這個(gè)static成員

到此這篇關(guān)于C/C++ extern和static的使用的文章就介紹到這了,更多相關(guān)C++ extern和static使用內(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-06-06
  • C++?pthread入門(mén)指南

    C++?pthread入門(mén)指南

    pthread是C++98接口且只支持Linux,使用時(shí)需要包含頭文件#include?<pthread.h>,編譯時(shí)需要鏈接pthread庫(kù),其中p是POSIX的縮寫(xiě),而POSIX是Portable?Operating?System?Interface的縮寫(xiě),這篇文章主要介紹了C++?pthread簡(jiǎn)介,需要的朋友可以參考下
    2024-05-05
  • C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫(kù))

    C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫(kù))

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++設(shè)計(jì)模式迪米特法則實(shí)例

    C++設(shè)計(jì)模式迪米特法則實(shí)例

    這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式迪米特法則實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++ 11實(shí)現(xiàn)檢查是否存在特定的成員函數(shù)

    C++ 11實(shí)現(xiàn)檢查是否存在特定的成員函數(shù)

    C++11/14相比以往的C++98/03在很多方面做了簡(jiǎn)化和增強(qiáng),尤其是在泛型編程方面,讓C++的泛型編程的威力變得更加強(qiáng)大,下面這篇文章主要介紹了利用C++ 11實(shí)現(xiàn)檢查是否存在特定成員函數(shù)的相關(guān)資料,需要的朋友可以參考下。
    2017-02-02
  • 一文詳解C++17中的結(jié)構(gòu)化綁定

    一文詳解C++17中的結(jié)構(gòu)化綁定

    C++17中的結(jié)構(gòu)化綁定(structured binding)是指將指定名稱(chēng)綁定到初始化程序的子對(duì)象或元素,本文主要來(lái)和大家聊聊C++17中結(jié)構(gòu)化綁定的實(shí)現(xiàn),感興趣的小伙伴可以了解下
    2023-12-12
  • C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    猜數(shù)字小游戲是我們小時(shí)候喜歡我們一個(gè)經(jīng)典小游戲。本文將用C語(yǔ)言實(shí)現(xiàn)這一經(jīng)典游戲,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • C語(yǔ)言使用深度優(yōu)先搜索算法解決迷宮問(wèn)題(堆棧)

    C語(yǔ)言使用深度優(yōu)先搜索算法解決迷宮問(wèn)題(堆棧)

    這篇文章主要介紹了C語(yǔ)言使用深度優(yōu)先搜索算法解決迷宮問(wèn)題,涉及C語(yǔ)言堆棧的使用與深度優(yōu)先算法解決迷宮問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • c++定義全局變量詳解

    c++定義全局變量詳解

    這篇文章主要給大家介紹了C++語(yǔ)言中定義全局變量,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2021-10-10
  • C語(yǔ)言中可變參數(shù)的使用方法示例

    C語(yǔ)言中可變參數(shù)的使用方法示例

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中可變參數(shù)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論

禹州市| 海原县| 阳原县| 临洮县| 天津市| 滨州市| 皋兰县| 松桃| 山西省| 来宾市| 永济市| 太仆寺旗| 齐河县| 卫辉市| 七台河市| 武邑县| 苏尼特左旗| 洛隆县| 玛沁县| 安岳县| 洞口县| 迁安市| 小金县| 丹棱县| 焉耆| 曲水县| 醴陵市| 许昌县| 北票市| 平原县| 称多县| 孙吴县| 楚雄市| 交口县| 正镶白旗| 宾川县| 新龙县| 怀安县| 津南区| 海林市| 巴彦县|