前幾天,乙個同事跟我說在我們的**庫裡面看到,乙個static函式被放在了標頭檔案裡面,可構建的時候卻沒有報告鏈結錯誤。我的第一反應也是,函式被放在標頭檔案裡面,當這個標頭檔案被多個原始檔引用之後,再把那幾個原始檔編譯產生的目標檔案鏈結起來的時候,應該會產生重定義錯誤的……
後來又仔細一想,static關鍵字不正是解決不同的原始檔中、同名函式的命名衝突問題的嗎?於是,快速做了乙個小驗證:
//「static_func.h」
#include static void display()
//「funca.c」
#include "static_func.h"
void funca()
//「funcb.c」
#include "static_func.h"
void funcb()
//「main.c」
extern void funca();
extern void funcb();
int main()
正常編譯、鏈結沒有問題,可執行檔案也能正常執行,證明了存在同名static函式的不同原始檔鏈結到一起是沒有問題的。
雖然還不清楚編譯器具體是怎麼實現的,但是對於c語言的static函式可以簡單的理解為,編譯器在處理static函式時,可能把static函式所在檔案的檔名當成了函式名的一部分,類似於c++中命名空間的概念。
使用『nm』命令檢視可執行檔案,除了看到函式『funca』和『funcb』之外,還看到了兩個『display()』,編譯器最終是怎麼區分這兩個同名的函式的暫時還沒有搞清楚,有待後續再進一步研究。
C語言 static修飾函式
在c語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。介紹它的第一條也是最重要的一條 隱藏。當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。下面是a...
C語言中static函式
1.含義 定義為static的函式,作用域為本檔案,它只能在定義該函式的原始檔中使用。2.好處 使用static的好處是 不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。其他檔案中可以定義相同名字的函式,不會發生衝突 靜態函式不能被工程內其他檔案所...
static 函式 C 中的static
函式中的靜態變數 當變數宣告為static時,空間將在程式的生命週期內分配,其被存放在在全域性資料區。即使多次呼叫該函式,靜態變數的空間也只分配一次,前一次呼叫中的變數值通過下一次函式呼叫傳遞。這對於在c c 或需要儲存先前函式狀態的任何其他應用程式非常有用。ps 對於乙個完整的程式,在記憶體中的分...