C語言的static函式

2021-10-07 04:33:53 字數 884 閱讀 3157

前幾天,乙個同事跟我說在我們的**庫裡面看到,乙個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 對於乙個完整的程式,在記憶體中的分...