我知道在c關鍵字有兩個用途:c和C++之間關鍵字static有什麼區別?
修改變量
修改全局變量
這種用法的限制的全局變量範圍的範圍從定義的點文件的結尾。
修改局部變量
這種用法限於局部變量的範圍所定義的函數,但也保持在存儲器的靜態區域
修改功能
此意味着只能調用它定義的文件中的函數。
和在C++中,除了用法c,static
也用於修改類的數據成員和函數成員。此用法限制屬於類的成員而不是類的對象。
我想知道在c/C++中還有其他用法static
嗎?
我知道在c關鍵字有兩個用途:c和C++之間關鍵字static有什麼區別?
修改變量
修改全局變量
這種用法的限制的全局變量範圍的範圍從定義的點文件的結尾。
修改局部變量
這種用法限於局部變量的範圍所定義的函數,但也保持在存儲器的靜態區域
修改功能
此意味着只能調用它定義的文件中的函數。
和在C++中,除了用法c,static
也用於修改類的數據成員和函數成員。此用法限制屬於類的成員而不是類的對象。
我想知道在c/C++中還有其他用法static
嗎?
static
可能是在C和C++的最容易混淆的重載關鍵字。它在不同的地方意味着不同的事物。
在功能,static
是存儲類,表示其中存在用於程序的生命週期的變量。所以說
void f() {
static int i = 0;
}
說的i
值將調用f()
之間被保留。其他存儲類別是C11/C++ 11中默認的auto
(但要注意C++ 11中含義的變化),extern
和register
,以及thread_local
。
在文件範圍(或C++中的命名空間範圍)中,static
是連接說明符。以這種方式標記爲static
的功能和變量具有內部鏈接,並且對於當前翻譯單元也是局部的。這意味着,像
static int f() {
return 3;
}
功能只能通過其他功能相同.c
文件中引用。在C++ 03中不推薦使用static
,而採用未命名的名稱空間。我在C++ 11中讀過一些不贊成的地方。
在C++中,當應用於類的成員函數或成員變量時,這意味着該函數或變量不需要類實例即可被訪問。除了C++類訪問說明符適用於成員之外,「類靜態」成員函數/變量和全局函數/變量在實現方面幾乎沒有區別。
一個最後一個:在C99(但不是C++),static
可以數組函數參數中使用,像這樣:
void f(int a[static 4]) {
}
此指定該參數a
必須由大小的整陣列至少4.
我想這就是他們的全部,但是讓我知道如果有什麼我已經忘記的評論!
無意中將此作爲一個社區維基,似乎無法撤消它,所以如果您有任何其他信息,請繼續並更新它。 –
這涵蓋了在數據聲明(或至少所有的情況下)使用'static'我能想到)。關於函數的'static'(它也有不同的含義,取決於函數是在名稱空間還是在類的作用域)。 –
靜態在C語言系列中,靜態變量是在編譯單元(源文件或模塊)的整個生命週期中存在的靜態變量。靜態變量可以在模塊範圍內聲明,因此可以被同一個源文件中定義的所有函數訪問。這種靜態變量不能從其他模塊直接訪問,但內部模塊API可以將指針傳遞給靜態變量,並通過指針修改這些變量。靜態變量也可以在函數體內聲明,其中通用的作用域規則適用。在函數內聲明的靜態變量僅在模塊初始化時(通常在應用程序加載時)初始化,並通過調用包含該定義的函數的多個 保留其值。
在C++中,靜態變量也可以是類定義的成員。訪問靜態成員 變量受標準訪問修飾符(私有,公共,受保護)控制,但該類的所有實例共享相同的靜態變量,並共享相同的值。修改此變量的值 會影響該類的所有對象。易失性易失性關鍵字是全部不同的東西,並不以任何方式與靜態相反。一個靜態變量可能會或可能不會被聲明爲volatile,就像全局或局部變量 一樣。 volatile關鍵字是一個提示,通知編譯器,如果沒有編譯器的知識,變量的值 可能會改變。因此,編譯器的代碼優化器不能對變量的當前值做出假設 ,並且必須始終(重新)讀取變量的內容。
請注意,成員也可以是成員函數,第二段忽略。另外,除了'volatile',一個靜態數據成員可以是'const'或'constexpr'。 – juanchopanza
參考C++ - >static
關鍵字可以用來聲明變量,函數,類數據成員和類函數。
下面是在不同的場景中常見的用法(ref from MSDN)
當你聲明在文件範圍內的變量或函數(全局和/或命名空間範圍),static關鍵字指定變量或函數有內部聯繫。在聲明變量時,變量具有靜態持續時間,編譯器將其初始化爲0,除非指定另一個值。
當你在一個函數中聲明一個變量時,static關鍵字指定變量保持它在該函數調用之間的狀態。
當您在類聲明中聲明數據成員時,static關鍵字指定該成員的一個副本由該類的所有實例共享。靜態數據成員必須在文件範圍內定義。您聲明爲const static的完整數據成員可以有一個初始化程序。
當您在類聲明中聲明成員函數時,static關鍵字指定該函數由該類的所有實例共享。靜態成員函數不能訪問實例成員,因爲該函數沒有隱式的指針。要訪問實例成員,請使用實例指針或引用的參數來聲明該函數。
您無法將聯合的成員聲明爲靜態。但是,全局聲明的匿名聯合必須明確聲明爲靜態。
你在哪裏發現你不能將一個工會的成員聲明爲靜態的?標準似乎允許它。 –
@JamesKanze不確定標準,但是在這裏編譯會給出錯誤http://ideone.com/hL2PLa – exexzian
幾點:你應該首先擺脫所有其他錯誤(如缺少分號),並且你應該添加至少一個非靜態成員;我找不到任何說空洞的工會是非法的,但我無法想象它有任何用處。除此之外:它看起來像g ++在這裏有一個錯誤,因爲它顯然是合法的,其他編譯器接受它。 –
從哪裏知道那些'用法'? – exexzian
@sansix e,從學習過程總結 – stamaimer