大家好,關于static函數很多朋友都還不太明白,不過沒關系,因為今天小編就來為大家分享關于c語言靜態函數的知識點,相信應該可以解決大家的一些困惑和問題,如果碰巧可以解決您的問題,還望關注下本站哦,希望對各位有所幫助!
c語言static的使用
在C語言中,static不僅可以用來修飾變量,還可以用來修飾函數,使用static修飾的變量,稱為靜態變量。
一、static修飾局部變量——靜態局部變量
結論:static修飾局部變量改變了變量的生命周期,讓靜態局部變量出了作用域依然存在,到程序結束,生命周期才結束。
static本質上是改變了變量的存儲類型,從棧區到了靜態區。
(拓展:內存被劃分為三個區域:
1.棧區:存放局部變量、函數的參數等局部的、臨時的變量
2.堆區:動態內存分配的
3.靜態區:全局變量、static修飾的靜態變量)
二、static修飾全局變量——靜態全局變量
結論:一個全局變量被static修飾,使得這個全局變量只能在本源文件內使用,不能在其他源文件中使用。(同一個項目中的其他源文件內都不可使用)
全局變量,在其他源文件內部可以被使用,是因為全局變量具有外部鏈接屬性,但是被static修飾之后,就變成了內部鏈接屬性,其他源文件就不能鏈接到這個靜態的全局變量了。
三、static修飾函數——靜態函數
總結:一個函數被static修飾,使得這個函數只能在本源文件內使用,不能在其他源文件內使用。
本質:static是將函數的外部鏈接屬性變成了內部鏈接屬性,和static修飾全局變量一樣。
回調函數是什么
1.回調函數是一個很有用,也很重要的概念。當發生某種事件時,系統或其他函數將會自動調用你定義的一段函數。
2.回調函數就相當于一個中斷處理函數,由系統在符合你設定的條件時自動調用。為此,你需要做三件事:1,聲明;2,定義;3,設置觸發條件,就是在你的函數中把你的回調函數名稱轉化為地址作為一個參數,以便于系統調用。
3.所謂回調函數就是按照一定的形式由你定義并編寫實現內容,當發生某種事件時,而由系統或其它函數來調用的函數。使用回調函數實際上就是在調用某個函數時,將自己編寫的一個函數的地址作為參數傳遞給那個函數。而那個函數在需要的時候,也就是某種事情發生的時候,利用傳遞的函數地址調用回調函數,這時你可以利用這個機會在回調函數中處理消息或完成一定的操作。回調函數只能是全局函數,或者是靜態函數,因為這個函數只是在這個類中使用,所以為了維護類的完整性,我們用類的靜態成員函數來做回調函數。
4.對于很多初學者來說,往往覺得回調函數很神秘,很想知道回調函數的工作原理。本文將要解釋什么是回調函數、它們有什么好處、為什么要使用它們等等問題,在開始之前,假設你已經熟知了函數指針。
(1)什么是回調函數?
簡而言之,回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。
(2)為什么要使用回調函數?
因為可以把調用者與被調用者分開。調用者不關心誰是被調用者,所有它需知道的,只是存在一個具有某種特定原型、某些限制條件(如返回值為int)的被調用函數。
如果想知道回調函數在實際中有什么作用,先假設有這樣一種情況,我們要編寫一個庫,它提供了某些排序算法的實現,如冒泡排序、快速排序、shell排序、shake排序等等,但為使庫更加通用,不想在函數中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,想讓庫可用于多種數據類型(int、float、string),此時,該怎么辦呢?可以使用函數指針,并進行回調。
回調可用于通知機制,例如,有時要在程序中設置一個計時器,每到一定時間,程序會得到相應的通知,但通知機制的實現者對我們的程序一無所知。而此時,就需有一個特定原型的函數指針,用這個指針來進行回調,來通知我們的程序事件已經發生。實際上,SetTimer()API使用了一個回調函數來通知計時器,而且,萬一沒有提供回調函數,它還會把一個消息發往程序的消息隊列。
另一個使用回調機制的API函數是EnumWindow(),它枚舉屏幕上所有的頂層窗口,為每個窗口調用一個程序提供的函數,并傳遞窗口的處理程序。如果被調用者返回一個值,就繼續進行迭代,否則,退出。EnumWindow()并不關心被調用者在何處,也不關心被調用者用它傳遞的處理程序做了什么,它只關心返回值,因為基于返回值,它將繼續執行或退出。
不管怎么說,回調函數是繼續自C語言的,因而,在C++中,應只在與C代碼建立接口,或與已有的回調接口打交道時,才使用回調函數。除了上述情況,在C++中應使用虛擬方法或函數符(functor),而不是回調函數。
static使用哪個頭文件
static使用局部變量分配于全局數據區的頭文件。
普通的static函數和普通的全局static變量的定義,應該放在源文件中,并且不應該在頭文件中有聲明。
假如想實現在多個cpp中復用該函數和static修飾的函數,限定在本源碼文件中,不能被本cpp文件以外的cpp文件調用。而普通的函數,默認是extern的,也就是說它可以被其它代碼文件調用。
static變量會被繼承嗎
不能繼承
在類定義中,它的成員(包括數據成員和成員函數)可以用關鍵字static聲明為靜態的,這些成員稱為靜態成員
靜態成員的特性:
?不管這個類創建了多少個對象,靜態成員只有一個拷貝,這個拷貝被所有屬于這個類的
對象共享
靜態成員包括:
?靜態數據成員
?靜態成員函數
在一個類中,若將一個數據成員聲明為static,這種成員稱為靜態數據成員。
(靜態數據成員在類內聲明,在類外定義)
?與一般的數據成員不同,無論建立了多少個對象,都只有一個靜態數據的拷貝
?可以認為該靜態數據是屬于該類的,而不是具體的屬于某一個對象
static定義的函數,怎么使用
static定義變量的使用:
一、靜態局部變量:
1、Static類內部變量同auto自動變量(即未加Static聲明的局部變量)一樣,是某個特定函數的局部變量,即只能在定義該變量的函數內使用該變量,2者作用域相同;兩者的不同在于:auto自動變量會隨著函數被調用和退出而存在和消失,而static類局部變量不會,它不管其所在的函數是否被調用,都將一直存在;不過,盡管該變量還繼續存在,但不能使用它。倘若再次調用定義它的函數時,它又可繼續使用,而且保存了前次被調用后留下的值。換言之,Static類型的內部變量是一種只能在某個特定函數中使用,但一直占據存儲空間的變量。
2、函數體內如果在定義靜態變量的同時進行了初始化,則以后程序不再進行初始化操作(出現在函數內部的基本類型的的靜態變量初始化語句只有在第一次調用才執行)。而對自動變量賦初值是在函數調用時進行,每調用一次函數重新給一次初值,相當于執行一次賦值語句。
3、靜態局部變量的初始化表達式必須是一個常量或者常量表達式。即使局部靜態變量定義時沒有賦初值,系統會自動賦初值0(對數值型變量)或空字符(對字符變量);靜態變量的初始值為0。而對自動變量auto來說,如果不賦初值則它的值將是個不確定的值。
4、當多次調用一個函數且要求在調用之間保留某些變量的值時,可考慮采用靜態局部變量。雖然用全局變量也可以達到上述目的,但全局變量有時會造成意外的副作用,因此仍以采用局部靜態變量為宜。
注:局部靜態變量占用內存時間較長,并且可讀性差,因此,除非必要,盡量避免使用局部靜態變量。
二、靜態全局變量
全局變量(外部變量)的說明之前再冠以static就構成了靜態的全局變量。
全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。
這兩者在存儲方式上并無不同。
這兩者的區別雖在于:
1、非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。
2、靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。
由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。
從以上分析可以看出
把局部變量改變為靜態變量后是改變了它的存儲方式,即改變了它的生存期。
把全局變量改變為靜態變量后是改變了它的作用域,限制了它的使用范圍。
因此static這個說明符在不同的地方所起的作用是不同的。應予以注意。
static定義變量的使用:
一、靜態局部變量:
1、Static類內部變量同auto自動變量(即未加Static聲明的局部變量)一樣,是某個特定函數的局部變量,即只能在定義該變量的函數內使用該變量,2者作用域相同;兩者的不同在于:auto自動變量會隨著函數被調用和退出而存在和消失,而static類局部變量不會,它不管其所在的函數是否被調用,都將一直存在;不過,盡管該變量還繼續存在,但不能使用它。倘若再次調用定義它的函數時,它又可繼續使用,而且保存了前次被調用后留下的值。換言之,Static類型的內部變量是一種只能在某個特定函數中使用,但一直占據存儲空間的變量。
2、函數體內如果在定義靜態變量的同時進行了初始化,則以后程序不再進行初始化操作(出現在函數內部的基本類型的的靜態變量初始化語句只有在第一次調用才執行)。而對自動變量賦初值是在函數調用時進行,每調用一次函數重新給一次初值,相當于執行一次賦值語句。
3、靜態局部變量的初始化表達式必須是一個常量或者常量表達式。即使局部靜態變量定義時沒有賦初值,系統會自動賦初值0(對數值型變量)或空字符(對字符變量);靜態變量的初始值為0。而對自動變量auto來說,如果不賦初值則它的值將是個不確定的值。
4、當多次調用一個函數且要求在調用之間保留某些變量的值時,可考慮采用靜態局部變量。雖然用全局變量也可以達到上述目的,但全局變量有時會造成意外的副作用,因此仍以采用局部靜態變量為宜。
注:局部靜態變量占用內存時間較長,并且可讀性差,因此,除非必要,盡量避免使用局部靜態變量。
二、靜態全局變量
全局變量(外部變量)的說明之前再冠以static就構成了靜態的全局變量。
全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。
這兩者在存儲方式上并無不同。
這兩者的區別雖在于:
1、非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。
2、靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。
由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。
把局部變量改變為靜態變量后是改變了它的存儲方式,即改變了它的生存期。
把全局變量改變為靜態變量后是改變了它的作用域,限制了它的使用范圍。
因此static這個說明符在不同的地方所起的作用是不同的。應予以注意。
中斷函數可以定義static嗎
可以的。
static一般不用在主函數中,大多數在中斷函數和封裝好的子函數里運用,它的作用是保證在子函數或中斷函數中定義的變量每次調用完之后都可以保持調用完時候的值。
中斷函數定義的局部變量在下次中斷時會被重新分配。如果需要下次中斷時還可以引用上次中斷的值,應該定義成全局的。
END,本文到此結束,如果可以幫助到大家,還望關注本站哦!