static鮮為人知的細微特性

2021-06-09 18:27:03 字數 2220 閱讀 7010

1,它的第一條也是最重要的一條:隱藏。

當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,乙個是a.c,另乙個是main.c.

下面是a.c的內容:

char a = 'a'; // global variable

void msg()

下面是main.c的內容:

int main(void)

程式的執行結果是:

a hello

你可能會問:為什麼在a.c中定義的全域性變數a和函式msg能在main.c中使用?前面說過,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。此例中,a是全域性變數,msg是函式,並且都沒有加static字首,因此對於另外的原始檔main.c是可見的。

如果加了static,就會對其它原始檔隱藏。

例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。static可以用作函式和變數的字首,對於函式來講,static的作用僅限於隱藏,而對於變數,static還有下面兩個作用。

2,區域性靜態變數和全域性變數即便重名也不會有名字衝突。

例如:

#include

int fun(void)

void test_1_name();

int count = 1;

//static char count ='a'; //此處定義就會出錯

int main(void)

void test_1_name()

儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。雖然這種用法不常見。

3,預設值為0的功能。這個主要和區域性變數相對的,由於全域性區的資料都可以預設初始化為0,而區域性變數在棧區分配為隨機數。

在靜態資料區,記憶體中所有的位元組預設值都是0x00,某些時候這一特點可以減少程式設計師的工作量。比如初始化乙個稀疏矩陣,我們可以乙個乙個地把所有元素都置0,然後把不是0的幾個元素賦值。如果定義成靜態的,就省去了一開始置0的操作。再比如要把乙個字元陣列當字串來用,但又覺得每次在字元陣列末尾加『\0』太麻煩。如果把字串定義成靜態的,就省去了這個麻煩,因為那裡本來就是『\0』。不妨做個小實驗驗證一下。

#include <stdio.h>

int a;

int main(void)

程式的執行結果如下integer: 0; string: (begin)(end)

最後對static的三條作用做一句話總結。首先static的最主要功能是隱藏,其次因為static變數存放在靜態儲存區,所以它具備永續性和預設值0.

4,類中靜態資料成員

靜態成員的提出是為了解決資料共享的問題。實現共享有許多方法,如:設定全域性性的變數或物件是一種方法。但是,全域性變數或物件是有侷限性的。我們主要講述類的靜態成員來實現資料的共享。

5,  由於靜態成員宣告於類中,操作於其外,所以對其取位址操作,就多少有些特殊

,變數位址是指向其資料型別的指標 ,函式位址型別是乙個「nonmember函式指標」。

6,由於靜態成員函式沒有this指標,所以就差不多等同於nonmember函式,結果就

產生了乙個意想不到的好處:成為乙個callback函式,使得我們得以將c++和c-based x w

indow系統結合,同時也成功的應用於執行緒函式身上。

7,不能將靜態成員函式定義為虛函式。

(8)靜態成員初始化與一般資料成員初始化不同:

初始化在類體外進行,而前面不加static,以免與一般靜態變數或物件相混淆;

初始化時不加該成員的訪問許可權控制符private,public等;

初始化時使用作用域運算子來標明它所屬類;

所以我們得出靜態資料成員初始化的格式:

《資料型別》《類名》::《靜態資料成員名》=《值》

(9)為了防止父類的影響,可以在子類定義乙個與父類相同的靜態變數,以遮蔽父類的影響。這裡有一點需要注意:我們說靜態成員為父類和子類共享,但我們有重複定義了靜態成員,這會不會引起錯誤呢?不會,我們的編譯器採用了一種絕妙的手法:name-mangling 用以生成唯一的標誌。

鮮為人知的C 特性

翻譯至 小括號的寫法 以下寫法等價 ptr 3 ptr 3 3 ptr 3 ptr most vexing parse 這個問題,可以通過加小括號規避 運算子 字母和符號 the tokens and,and eq,bitand,bitor,compl,not,not eq,or,or eq,xor...

鮮為人知的 Python 語法

所有人 好吧,不是所有人 都知道 python 是一門用途廣泛 易讀 而且容易入門的程式語言。但同時 python 語法也允許我們做一些很奇怪的事情。眾所周知 python 的 lambda 表示式不支援多行 但是可以模擬出多行 的效果。def f x string if x.endswith g ...

C 鮮為人知的符號

目錄 1 1.引言 1 2.少為人知的符號表1 1 2.1.符號表 1 2.2.示例 2 3.少為人知的符號表2 2 3.1.符號表 2 3.2.示例 3 這些鮮為人知的c 符號,可直接在 中使用,但實踐中不推薦這麼做,可作為茶餘飯後的樂趣了解c 的另一面。雖然它們鮮為人知,但卻不是gnu g 獨有...