C c static和匿名命名空間 總結

2021-05-27 03:05:31 字數 1276 閱讀 7134

from

static:

1、函式之外的變數就是全域性變數,這個想法正確嗎? 

答: 在c中,完全正確。只不過按有沒有加static修飾可以分為靜態全域性變數和一般全域性變數兩種。 

2 如果在全域性變數的前面加上static 會有什麼用? 

答:在c中,靜態全域性變數意味著兩個方面。一、在生命期方面,它與一般全域性變數一樣,是與整個程式共存亡的;二、在可見性方面,它只在定義它的那個編譯單元中可見。比如說,你在testa.c中定義了乙個靜態全域性變數x: static int x;則你只能在testa.c的函式中引用它,在另乙個檔案testb.c中如果想用它的話:extern int x;然後再某個函式中使用x,則一般編譯器在連線階段會報錯說找不到x這個符號。 

3 如果在函式的前面加上static 會有什麼用? 

答:與靜態全域性變數差不多。簡單地說,在testa.c中定義的靜態函式:static void a(void)是不能在testb.c的函式中呼叫的,如果一定要這樣的話編譯器連線時會報錯的。

static的用途:一般對那些非介面函式和確定外部不使用的全域性變數加上static限制,可以保證不會被其它編譯單元非法使用,同時也可以避免與別的編譯單元中的同名符號衝突。在驅動程式中用的較多。

匿名空間:

當定義乙個命名空間時,可以忽略這個命名空間的名稱:

namespce

編譯器在內部會為這個命名空間生成乙個唯一的名字,而且還會為這個匿名的命名空間生成一條using指令。所以上面的**在效果上等同於:

namespace __unique_name_ 

using namespace __unique_name_;

在匿名命名空間中宣告的名稱也將被編譯器轉換,與編譯器為這個匿名命名空間生成的唯一內部名稱(即這裡的__unique_name_)繫結在一起。還有一點很重要,就是這些名稱具有internal鏈結屬性,這和宣告為static的全域性名稱的鏈結屬性是相同的,即名稱的作用域被限制在當前檔案中,無法通過在另外的檔案中使用extern宣告來進行鏈結。如果不提倡使用全域性static宣告乙個名稱擁有internal鏈結屬性,則匿名命名空間可以作為一種更好的達到相同效果的方法。

注意:命名空間都是具有external 連線屬性的,只是匿名的命名空間產生的__unique_name__在別的檔案中無法得到,這個唯一的名字是不可見的.

c++ 新的標準中提倡使用匿名命名空間,而不推薦使用static,因為static用在不同的地方,涵義不同,容易造成混淆.另外,static不能修飾class

C c static和匿名命名空間 總結

static 1 函式之外的變數就是全域性變數,這個想法正確嗎?答 在c中,完全正確。只不過按有沒有加static修飾可以分為靜態全域性變數和一般全域性變數兩種。2 如果在全域性變數的前面加上static 會有什麼用?答 在c中,靜態全域性變數意味著兩個方面。一 在生命期方面,它與一般全域性變數一樣...

C 命名空間 預設命名空間與匿名命名空間

2.匿名命名空間 預設命名空間也叫全域性命名空間,所有沒有置於某一具體命名空間下的 即在預設命名空間下,例如func main 函式。include void func void intmain int argc,char ar void func void 需要注意的是 這個就是類似於c語言裡簡單...

C 匿名命名空間

當定義乙個命名空間時,可以忽略這個命名空間的名稱 namespce 編譯器在內部會為這個命名空間生成乙個唯一的名字,而且還會為這個匿名的命名空間生成一條using指令。所以上面的 在效果上等同於 namespace unique name using namespace unique name 在匿...