2.1 什麼叫函式重複定義
我們經常會遇到報錯,說變數或者函式重複定義。那麼,在此,首先我舉例說明一下什麼叫函式的重複定義。
檔案void
test()
檔案void
test()
那麼,在編譯的時候是不會報錯的,但是,在鏈結的時候,會出現報錯:
multiple definition of `test',因為在同乙個工程裡面出現了兩個test函式的定義。
檔案編譯工程時不會報錯,但是test()函式只能被 a.c 和 b.c 中的函式呼叫,不能被 c.c 等其他檔案中的函式呼叫。static
void
test()
void
test_a()
檔案static
void
test()
void
test_b()
那麼,用static修飾 .h 檔案中定義的函式,會有什麼效果呢?
檔案static
void
test()
檔案#include "a.h"
void
test_b()
檔案#include "a.h"
void
test_c()
檔案這樣就「不小心」產生問題了,因為 b.h 和 c.h 都包含了 a.h,那麼,在預編譯main.c 檔案的時候,會展開為如下形式:static
void
test_a()
檔案#include "a.h"
檔案#include "a.h"
檔案#include "b.h"
#include "c.h"
void
main()
預編譯之後的臨時檔案在同乙個 .c 裡面,出現了兩次 test_a() 的定義,因此,會出現重複定義的報錯。static
void
test_a()
static
void
test_a()
void
main()
但是,如果在 a.h 裡面加上了 #ifndef……#define……#endif 的話,就不會出現這個問題了。
例如,上面的 a.h 改為:
檔案預編譯展開main.c則會出現:#ifndef a_h
#define a_h
static
void
test_a()
#endif
預編譯後的臨時檔案在編譯main.c時,當遇到第二個 #ifndef a_h ,由於前面已經定義過 a_h,故此段**被跳過不編譯,因此,不會產生重複定義的報錯。這就是 #ifndef……#define……#endif 的精髓所在。#ifndef a_h
#define a_h
static
void
test_a()
#endif
#ifndef a_h
#define a_h
static
void
test_a()
#endif
void
main()
(九)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 ...