2016-12-17 66 views
7

我有兩個C文件。C中的void和static void函數有什麼區別?

file1.c中

int main() 
{ 
    func(); 
    return 0; 
} 

file2.c中

static void func(void) 
{ 
    puts("func called"); 
} 

但是,如果我用命令cc file2.c file1.c編譯上面的代碼中,我得到了下面,

undefined reference to `func' 
collect2: error: ld returned 1 exit status 

但是,如果我在file2.c中刪除static關鍵字並用命令cc file2.c file1.c編譯上面的代碼,它成功運行。

所以,我有一個問題,在C中void和static void函數有什麼區別?

+5

靜態函數不能從任何其他編譯單元中調用。除去static關鍵字,並且該函數可以從任何編譯單元調用,因此程序將鏈接。 – Peter

+0

Peter的基本上是正確的,但是有一種高級場景,如果指向該函數的指針可用於其他文件中的代碼,則靜態函數可以由不同源文件中的代碼調用。你可能不需要爲此擔心;你可能還需要了解有關函數的指針。嚴格的版本是「一個'static'函數不能通過其自己的翻譯單元之外的代碼調用_by name_」。 –

+0

@Jonathan Leffler:哇。我會回答這樣的彼得,但是,你是對的。哦,我知道如何使用一個指針來運作,但是,我們並沒有記住所有特定場景的黑客。另外,因爲如果一個函數必須在外面調用,還有一個指針,我不會聲明它是靜態的。確定黑客,但請記住它是一個黑客,而不是「你必須學習如何使用指針來運行」 – jurhas

回答

15

C中的void和static void函數有什麼區別?

真正的問題應該是staticnon-static函數有什麼區別? (返回類型void是無關緊要的,它可以是int或其他任何東西)。

static關鍵字有些過度使用。當它適用於功能時,表示該功能有internal linkage,即其範圍限於translation unit(僅作爲源文件)。

默認情況下,函數是非靜態的並且具有外部鏈接。該功能可以被不同的源文件使用。

就你的情況而言,由於static func不能在其他源文件中使用,因此會出現錯誤。


什麼時候應該使用static函數?

static函數通常用於避免更大項目中的名稱衝突。如果您檢查Linux內核源碼,例如在drivers/net中,您會看到很多static void函數。驅動程序由不同的供應商開發,使用static函數確保他們可以按自己的方式命名函數,而不用擔心與其他非相關驅動程序開發人員的名稱衝突。

+1

非常感謝您的好評。 –

相關問題