static 關鍵詞的使用

2021-06-29 02:48:52 字數 1774 閱讀 6271



2.1  什麼叫函式重複定義

我們經常會遇到報錯,說變數或者函式重複定義。那麼,在此,首先我舉例說明一下什麼叫函式的重複定義。

檔案

void

test() 

檔案void

test() 

那麼,在編譯的時候是不會報錯的,但是,在鏈結的時候,會出現報錯:

multiple definition of `test',因為在同乙個工程裡面出現了兩個test函式的定義。

檔案

static

void

test() 

void

test_a() 

檔案static

void

test() 

void

test_b() 

編譯工程時不會報錯,但是test()函式只能被 a.c 和 b.c 中的函式呼叫,不能被 c.c 等其他檔案中的函式呼叫。

那麼,用static修飾 .h 檔案中定義的函式,會有什麼效果呢?

檔案

static

void

test() 

檔案#include "a.h"

void

test_b() 

檔案#include "a.h"

void

test_c() 

檔案

static

void

test_a() 

檔案#include "a.h"

檔案#include "a.h"

檔案#include "b.h"

#include "c.h"

void

main() 

這樣就「不小心」產生問題了,因為 b.h 和 c.h 都包含了 a.h,那麼,在預編譯main.c 檔案的時候,會展開為如下形式:

預編譯之後的臨時檔案

static

void

test_a() 

static

void

test_a() 

void

main() 

在同乙個 .c 裡面,出現了兩次 test_a() 的定義,因此,會出現重複定義的報錯。

但是,如果在 a.h 裡面加上了 #ifndef……#define……#endif 的話,就不會出現這個問題了。

例如,上面的 a.h 改為:

檔案

#ifndef  a_h

#define a_h

static

void

test_a() 

#endif

預編譯展開main.c則會出現:

預編譯後的臨時檔案

#ifndef a_h

#define a_h

static

void

test_a() 

#endif

#ifndef a_h

#define a_h

static

void

test_a() 

#endif

void

main() 

在編譯main.c時,當遇到第二個 #ifndef  a_h ,由於前面已經定義過 a_h,故此段**被跳過不編譯,因此,不會產生重複定義的報錯。這就是  #ifndef……#define……#endif 的精髓所在。

(九)static 與 final 關鍵詞的使用

我的總結就是 當子類 重寫 了父類的靜態成員方法,建立物件的時候,若呼叫的靜態方法,那麼自會呼叫父類的成員方法,而呼叫普通方法,則會呼叫子類重寫的父類的普通成員方法。不過現在好像不能使用例項化物件來呼叫靜態成員方法了,寫上了編譯也不會通過。例子如下 package 03 static和finall關...

C語言 關鍵詞static解釋

static static在c語言中可以修飾變數或者函式。總得來說,用static修飾的變數或是函式具有靜態的特性。static修飾區域性變數 static修飾區域性變數的主要改變在於改變了區域性變數的生命週期。一般的區域性變數,生命週期都是在它的函式內,在函式結束的時候,就會釋放變數。再次進入函式...

PHP 類Static 靜態關鍵詞

class myclass1 public static function staticfun print myclass1 my var n 不例項化,用範圍解析操作符直接訪問靜態屬性,輸出php print myclass1 fun1 n 不例項化,用範圍解析操作符直接訪問公共方法,輸出php ...