我有兩個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函數有什麼區別?
靜態函數不能從任何其他編譯單元中調用。除去static關鍵字,並且該函數可以從任何編譯單元調用,因此程序將鏈接。 – Peter
Peter的基本上是正確的,但是有一種高級場景,如果指向該函數的指針可用於其他文件中的代碼,則靜態函數可以由不同源文件中的代碼調用。你可能不需要爲此擔心;你可能還需要了解有關函數的指針。嚴格的版本是「一個'static'函數不能通過其自己的翻譯單元之外的代碼調用_by name_」。 –
@Jonathan Leffler:哇。我會回答這樣的彼得,但是,你是對的。哦,我知道如何使用一個指針來運作,但是,我們並沒有記住所有特定場景的黑客。另外,因爲如果一個函數必須在外面調用,還有一個指針,我不會聲明它是靜態的。確定黑客,但請記住它是一個黑客,而不是「你必須學習如何使用指針來運行」 – jurhas