所以這個:
//file_a.c
void function_a(void)
{
//...
}
使function_a
不帶任何參數,並且不返回任何值的函數。這個函數可能被同一個文件function_a
中的所有其他函數使用,或者在其他任何.c
文件中,您告訴編譯器將它們放到最終的程序中。
換句話說,此功能可供您的程序的所有翻譯單元訪問。如果你有一個名爲file_a.c
文件這一功能,你也有被稱爲另一個文件file_z.c
你可以這樣做:
//file_z.c
void function_z(void)
{
function_a();
}
所有的罰款。
在另一方面,這
//file_b.c
static void function_b(void)
{
//...
}
(我改名爲清楚起見功能)
使function_b
不帶任何參數,並且不返回任何值,就像function_a
功能。但是,它也表示function_b
在翻譯單元中具有靜態文件範圍,該範圍始於或包含file_b.c
。這意味着它不能被其他翻譯單元訪問。
所以,如果你現在試圖做到這一點file_z.c
:
void function_z(void)
{
function_b();
}
你會得到編譯錯誤:
file_z.c:(.text+0xa): undefined reference to `function_b'
collect2: error: ld returned 1 exit status
因爲每個file_{a,b,z}.c
是(或可能應該是)的起點,其擁有單獨的翻譯單元,並且function_b
在file_b.c
中被聲明爲具有靜態文件範圍,但對於其他翻譯單元而言,該功能只是「不存在」。現在
,以聲明的變量只是function_b
之前,我把他們有點像這樣:
//file_a.c
int array[10];
void function_a(void)
{
//...
}
這只是聲明瞭一個全局變量。它可以通過file_a.c
中的所有函數訪問,只要它們在之後出現聲明。它也可以使用其他翻譯單元(如file_b.c
或file_z.c
)如果你聲明它是這樣的:
//file_b.c
extern int array[10];
當你編譯一切togheter,在翻譯單元聲明與file_b.c
開始將告訴編譯器array
不是該file_b.c
中的文件範圍變量;相反,編譯器將不得不在另一個翻譯單元中查找該變量,然後將它們鏈接在一起,以便所有函數對10個整數的塊執行相同的操作。
它們是在主函數*還是在*文件*中定義的? – StoryTeller
對不起,我剛剛編輯。它們在主函數 –
上方的文件中定義。請發佈一個完整的示例而不是片段。 – Lundin